近年來,WebSocket 技術在網路開發中越來越流行,尤其是在即時通訊、線上遊戲、推播訊息等領域。而 Swoole 作為一款高效能、非同步的 PHP 擴展,可以幫助開發者輕鬆建立高效能的 WebSocket 伺服器。本文將介紹如何使用 Swoole 建立一個高效能的 WebSocket 伺服器。
一、安裝 Swoole
Swoole 支援 PHP 5.3~7.4 版本,可透過 pecl 或原始碼安裝。以下以原始碼安裝為例:
首先下載的Swoole 安裝包,然後解壓縮進入目錄,執行下列指令:
phpize ./configure make make install
安裝完成後,在php.ini 中加入下列設定項啟用Swoole 擴充功能:
extension=swoole
安裝完成後,使用php --ri swoole
指令可以查詢Swoole 的基本資訊。
二、建立 WebSocket 伺服器
下面我們來建立一個簡單的 WebSocket 伺服器。首先在專案根目錄下建立一個 server.php 文件,輸入以下程式碼:
<?php $server = new swoole_websocket_server("0.0.0.0", 9502); $server->on("open", function (swoole_websocket_server $server, swoole_http_request $request) { echo "client {$request->fd} connected "; }); $server->on("message", function (swoole_websocket_server $server, $frame) { echo "received message: {$frame->data} "; }); $server->on("close", function (swoole_websocket_server $server, $fd) { echo "client {$fd} closed "; }); $server->start();
以上程式碼中,我們先建立了一個 swoole_websocket_server 實例,設定監聽位址為 0.0.0.0,連接埠為 9502。接著分別監聽了 open、message、close 三個事件,在客戶端連線建立、接收到訊息、連線關閉時分別觸發對應的事件處理函數。
接下來在控制台執行以下指令啟動WebSocket 伺服器:
php server.php
如果一切正常,可以看到類似下列輸出:
2019-06-17 10:51:17|INFO|Server Start: 0.0.0.0:9502
三、測試WebSocket 伺服器
啟動WebSocket 伺服器後,可以使用前端開發者常用的WebSocket 外掛工具,例如Firefox 的Simple WebSocket Client 外掛程式或Chrome 的WebSocket Client 外掛程式測試伺服器是否正常運作。
以 Firefox Simple WebSocket Client 為例,開啟外掛程式後輸入 ws://127.0.0.1:9502 點選 Connect 按鈕即可。這時候我們會發現,在伺服器端控制台輸出了輸出了 "client 1 connected" 日誌,這表示 WebSocket 用戶端已經成功連接了伺服器。
我們可以在插件的傳送區域輸入測試內容,例如輸入"hello" 然後點擊send 按鈕,就可以在控制台看到對應的"received message: hello" 日誌,說明伺服器已經成功接收了WebSocket 用戶端所傳送的訊息。
四、提高效能
在大流量場景下,WebSocket 伺服器的效能是非常關鍵的。 Swoole 提供了多種機制來提高 WebSocket 伺服器的效能。
透過在程式碼中呼叫SwooleCoroutineun
函數開啟協程,可以讓多個協程並發執行,提高伺服器的吞吐量。
例如,修改server.php 中的程式碼:
<?php use SwooleCoroutine; Coun(function () { $server = new swoole_websocket_server("0.0.0.0", 9502); $server->on("open", function (swoole_websocket_server $server, swoole_http_request $request) { echo "client {$request->fd} connected "; }); $server->on("message", function (swoole_websocket_server $server, $frame) { echo "received message: {$frame->data} "; }); $server->on("close", function (swoole_websocket_server $server, $fd) { echo "client {$fd} closed "; }); $server->start(); });
在啟動伺服器的時候,可以透過設定worker 數量來提高伺服器的並發處理能力。可以透過以下方式設定 worker 個數:
$server->set([ 'worker_num' => 4, // 工作进程数量 ]);
在協程下,需要在 run 函數內才能設定 worker 數量。
如果WebSocket 伺服器需要操作資料庫,可以使用Swoole 的非同步MySQL 用戶端,可以避免因為資料庫操作導致的阻塞,從而提高伺服器效能。
例如,使用 Swoole 非同步 MySQL 用戶端取得一筆記錄的範例程式碼如下:
$db = new SwooleCoroutineMySQL(); $db->connect([ 'host' => 'localhost', 'port' => 3306, 'user' => 'root', 'password' => '', 'database' => 'test', ]); $res = $db->query('SELECT * FROM users WHERE id = 1');
以上就是如何使用 Swoole 建立高效能的 WebSocket 伺服器的基本流程。透過使用 Swoole 提供的非同步支援、多進程、協程等優勢,可以大幅提高 WebSocket 伺服器的效能,使應用程式更加穩定且有效率。
以上是如何使用Swoole建立高效能的WebSocket伺服器的詳細內容。更多資訊請關注PHP中文網其他相關文章!