windows 系統下 workerman 在同一個執行視窗中開啟多個 websocket 服務

極客飛兔發表於2023-03-17

? 開啟多個 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

相關文章