php – swoole – 架設 websocket 簡單範例

安裝 swoole 擴展 以後,接著我們要示範是否能建立 websocket 給 Client 端。

swoole.php

<?php 
// 建立 websocket 物件,監聽 0.0.0.0:8080 連接埠
$ws = new swoole_websocket_server("0.0.0.0", 8080); // 0.0.0.0 等於 localhost

// 監聽 WebSocket 連接打開事件
$ws->on('open', function ($ws, $request) {
    var_dump($request->fd, $request->get, $request->server);
    $ws->push($request->fd, "hello, welcome\n");
});

// 監聽 WebSocket 訊息事件
$ws->on('message', function ($ws, $frame) {
    echo "Message: {$frame->data}\n";
    $ws->push($frame->fd, $frame->data);
});

// 今天 WebSocket 連接關閉事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed\n";
});

$ws->start();
  • $ws->push() 推送給 Client 端數據。參考
  • 在 callback 中的 echo, print_r, var_dump … 的輸出,都會顯示在 Command-Lind 而不是給 Client 端。

 

Client 的 JS 程式碼 index.html

var wsServer = 'ws://XXXXXX.com:8080';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {
    console.log("成功連接到 WebSocket 服務");
};

websocket.onclose = function (evt) {
    console.log("關閉連接服務");
};

websocket.onmessage = function (evt) {
    console.log('接收伺服器數據: ' + evt.data);
};

websocket.onerror = function (evt, e) {
    console.log('發生錯誤: ' + evt.data);
};

 

使用 command line 觸發 Swoole

php swoole.php

如果使用如 SSH 連接遠端主機下了這個指令,一旦關閉操作視窗後,運行 websocket 會停止。要是你希望 Linux 使用者離開後,服務仍然啟動,可以使用 screen 指令 (或 nohup 指令)。例如

screen php swoole.php

這樣就會開始執行,但我們要將程序放到背景(卸離),所以按下 Ctrl + A 之後,再按 D 會出現類似

[detached from 19719.pts-0.i]

就代表已經放到背景了(參考)。如果要回到剛剛用 screen 執行的 swoole ,可以打上

screen -r

要顯示哪些 php 被運行,可以使用

ps -fC php

可使用 kill 指令刪掉來關閉服務

kill 13080
kill 13081
kill 13083

參考網友

瀏覽器運行

上方 onMessage 目前會將接收到的訊息,發送給所有人。也就是說,如果是A發送到 websocket,那麼 websocket 也會把訊息發送給 A,B,C,D…… 如果自己發送的訊息不想接收到,可以參考進階範例

Comments

發表迴響