php – swoole – 架設 websocket 簡單範例

安裝 swoole 擴展 以後,接著我們要示範是否能建立 websocket 給 Client 端。
swoole.php
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
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
1 2 3 |
php swoole.php |
如果使用如 SSH 連接遠端主機下了這個指令,一旦關閉操作視窗後,運行 websocket 會停止。要是你希望 Linux 使用者離開後,服務仍然啟動,可以使用 screen 指令 (或 nohup 指令)。例如
1 2 3 |
screen php swoole.php |
這樣就會開始執行,但我們要將程序放到背景(卸離),所以按下 Ctrl + A 之後,再按 D 會出現類似
1 2 3 |
[detached from 19719.pts-0.i] |
就代表已經放到背景了(參考)。如果要回到剛剛用 screen 執行的 swoole ,可以打上
1 2 3 |
screen -r |
要顯示哪些 php 被運行,可以使用
1 2 3 |
ps -fC php |
可使用 kill 指令刪掉來關閉服務
1 2 3 4 5 |
kill 13080 kill 13081 kill 13083 |
瀏覽器運行
上方 onMessage 目前會將接收到的訊息,發送給所有人。也就是說,如果是A發送到 websocket,那麼 websocket 也會把訊息發送給 A,B,C,D…… 如果自己發送的訊息不想接收到,可以參考進階範例。
Comments