? 開啟多個 ws 服務失敗
- 正常情況下,如果你想開啟多個
websocket
服務的話 - 只要在一個檔案中,輸入
new Worker
兩次,監聽不同埠,使用Worker::runAll()
命令即可 - 但是你會發現在在
windows
中無法在一個檔案中同時監聽兩個websocket
服務,其他系統比如Linux
是沒有問題的 - 會報
multi workers init in one php file are not support
錯誤,意思windows
中禁止在同一個檔案中開啟多個websocket
服務
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
$http_worker = new Worker("http://0.0.0.0:1234");
$http_worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send('hello http');
};
$ws_worker = new Worker('websocket://0.0.0.0:2345');
$ws_worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send('hello websocket');
};
// 執行所有Worker例項
Worker::runAll();
? 開啟服務失敗解決辦法
-
windows
版本的workerman
不支援在同一個檔案中例項化多個Worker
。因此
windows
版本的workerman
需要將多個Worker
例項初始化放在不同的檔案中才可以解決 -
比如我們定義兩個檔案,一個
start_http.php
,另一個是start_websocket.php
,在檔案中分別加入以下程式碼,監聽不同埠,然後使用php 檔名
命令啟動這兩個檔案即可
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// 需要監聽不同的埠
$ws_worker = new Worker('websocket://0.0.0.0:xxxx');
$ws_worker->onMessage = function(TcpConnection $connection, $data)
{
$connection->send('hello websocket');
};
// 執行所有Worker例項(這裡只有一個例項)
Worker::runAll();
? 同一個視窗中執行
- 上面雖然可以解決執行多個
websocket
例項,但是你會發現有幾個檔案,就會有幾個執行視窗 - 如果開啟的服務更多,視窗也會更多,那麼如何在同一個視窗中執行啟動多個服務呢
- 那麼如果要解決這個問題,我們就可以建立一個
init.bat
檔案,然後在檔案中加入以下程式碼,然後雙擊執行即可實現在同一個視窗中啟動多個服務 - /d: 表示切換目錄
- /b: 表示不開啟新視窗,在當前視窗繼續執行
%切換到專案根目錄%
cd /d E:\xxxxxx
%啟動第一個服務%
start /b php start_http.php
%啟動第二個服務%
start /b php start_websocket.php