在 ServBay 中使用 Swoole 建構高效能 PHP 應用
ServBay 是專為開發者打造的本地(在地)Web 開發環境,內建多種語言環境、資料庫與工具,旨在簡化本機端的開發流程。本文重點說明如何在 ServBay 環境下透過 Swoole 擴充強化 PHP 應用效能,架設高效能的網路服務。
什麼是 Swoole?
Swoole 是專為 PHP 設計,基於協程(Coroutine)、並行與高效能的網路通訊引擎,由純 C 語言實作,為 PHP 帶來非同步、並行、協程式的網路通訊能力。有了 Swoole,PHP 開發者可跳脫傳統 Web 伺服器(如 Apache/Nginx + PHP-FPM)的請求-回應限制,更高效地處理高併發任務,如打造常駐記憶體的 Web 伺服器、非同步任務處理、即時通訊服務(如 WebSocket)等。
Swoole 主要特色:
- 高效能: 低層 C 語言打造,提供非同步 I/O、多進程與多執行緒支援。
- 協程: 輕量級協程,讓同步碼即能非同步執行,簡化非同步程式設計。
- 協定豐富: 原生支援 TCP/UDP/HTTP/WebSocket 多種網路協定。
- 易於上手: 提供貼近 PHP 使用習慣的簡潔 API。
- 常駐記憶體: 可做為常駐進程執行,免去傳統 PHP 每次請求都需初始化環境的耗損。
藉助 Swoole,PHP 不再只是 Web 腳本語言,更能勝任各式高效能網路應用場景。
在 ServBay 中啟用 Swoole
ServBay 的設計宗旨之一,就是讓開發者能輕鬆管理與善用各式 PHP 擴充。Swoole 身為現代高效能 PHP 開發關鍵擴充,已隨 ServBay 預先內建。只需幾個步驟即可啟用。
前提條件:
- 已安裝並啟動 ServBay。
- 確認 ServBay 已安裝至少一個 PHP 版本。
啟用步驟:
- 開啟 ServBay 應用程式介面。
- 導覽至「套件 (Packages)」或 PHP 版本管理介面。(註:依 ServBay 版本不同名稱可能略有差異,通常在主畫面或設定中可找到)
- 選擇你要啟用 Swoole 的 PHP 版本。
- 找到 Swoole 擴充選項並勾選啟用。 ServBay 通常會以清單或開關形式顯示已編譯好的擴充。
- 儲存變更,並依指示重啟 ServBay 或對應的 PHP 服務。 ServBay 會自動配置 PHP 環境並載入 Swoole 擴充。
完成上述步驟後,你即可在指定的 PHP 版本內使用 Swoole。你可於終端中執行 php -m
指令,確認 swoole
是否出現在已載入的擴充清單中。
TIP
ServBay 建議將你的网站與專案檔案放於 /Applications/ServBay/www
目錄下,有利於網站管理與配置。本文範例也將依據此路徑操作。
建立簡易 Swoole HTTP 伺服器
接下來,我們將建立一個基本的 Swoole HTTP 伺服器,簡單示範如何處理 Web 請求。
步驟 1:建立專案目錄
打開終端,建立並進入新專案資料夾。依 ServBay 建議,放在 /Applications/ServBay/www
下:
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
2
3
步驟 2:撰寫伺服器腳本
於 servbay-swoole-http
目錄下新增一個名為 server.php
的檔案,並加入以下內容:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
// 建立 Swoole HTTP 伺服器實例
// 監聽所有網路介面 (0.0.0.0) 的 9501 埠口
$server = new Server("0.0.0.0", 9501);
// 註冊 'start' 事件回呼函式
// 當伺服器啟動成功時觸發
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
// 可在此記錄主進程 ID、管理進程 ID 等資訊
});
// 註冊 'request' 事件回呼函式
// 當收到新的 HTTP 請求時觸發
$server->on("request", function (Request $request, Response $response) {
// 設定回應標頭
$response->header("Content-Type", "text/plain");
// 根據請求路徑或參數處理邏輯
$path = $request->server['request_uri'] ?? '/';
$content = "Hello ServBay!";
if ($path === '/info') {
$content = "Request path: " . $path . "\n";
$content .= "Method: " . $request->server['request_method'] . "\n";
$content .= "Client IP: " . $request->server['remote_addr'] . "\n";
// 更多請求資訊可透過 $request 物件取得
}
// 傳送回應主體並結束請求
$response->end($content);
});
// 啟動伺服器
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
這支腳本會建立一個 9501 埠口的 Swoole HTTP 伺服器。當收到請求時,預設回應簡單文字 "Hello ServBay!";若造訪 /info
路徑則會顯示部分請求相關資訊。
步驟 3:執行 Swoole 伺服器
確認終端目前目錄在 servbay-swoole-http
,並用 ServBay 已啟用 Swoole 擴充的 PHP 版本執行腳本:
php server.php
若一切順利,你將於終端看到如下輸出:
Swoole HTTP server is started at http://0.0.0.0:9501
表示 Swoole HTTP 伺服器已於後台運行並監聽 9501 埠口。
步驟 4:存取 Swoole 伺服器
開啟瀏覽器,造訪以下網址:
http://localhost:9501
http://localhost:9501/info
網頁分別會顯示 Hello ServBay!
和請求資訊文字。
若要終止伺服器,回到腳本執行的終端,按下 Ctrl + C
即可。
使用 Swoole 處理 WebSocket 連線
Swoole 原生支援 WebSocket 協定,非常適合構建即時通訊應用,如聊天室、遊戲伺服器、即時資料推送等。
步驟 1:建立 WebSocket 伺服器腳本
在 /Applications/ServBay/www/servbay-swoole-http
(或另建一個如 servbay-swoole-websocket
的資料夾)新增 websocket_server.php
檔案,加入下列內容:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
// 建立 Swoole WebSocket 伺服器實例
// WebSocket 伺服器繼承自 HTTP 伺服器,因此也能處理 HTTP 請求
$server = new Server("0.0.0.0", 9502); // 監聽 9502 埠
// 註冊 'start' 事件,伺服器啟動時觸發
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
// 註冊 'open' 事件
// 當新 WebSocket 連線建立時觸發
// $request 物件包含用戶端連線資訊,如 $request->fd 為客戶端檔案描述符
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
// 可向用戶端發送歡迎訊息
$server->push($request->fd, "Welcome to ServBay WebSocket Demo!");
});
// 註冊 'message' 事件
// 當伺服器收到用戶端發來的 WebSocket 訊息時觸發
// $frame 物件包含訊息內容 $frame->data、連線描述符 $frame->fd
$server->on("message", function (Server $server, Frame $frame) {
echo "received message from {$frame->fd}: {$frame->data}\n";
// 可廣播訊息給所有用戶端,或只回覆發送者
// 例如,回覆發送者
$server->push($frame->fd, "Hello, you sent: {$frame->data}");
// 廣播範例(須維護連線列表或遍歷)
// foreach ($server->connections as $fd) {
// if ($fd != $frame->fd) { // 不發送給發信人自己
// $server->push($fd, "User {$frame->fd} says: {$frame->data}");
// }
// }
});
// 註冊 'close' 事件
// 當用戶端連線關閉時觸發
$server->on("close", function ($ser, $fd) {
echo "connection close: {$fd}\n";
});
// 啟動伺服器
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
本腳本於 9502 埠運行 Swoole WebSocket 伺服器,定義多個重要事件回呼:start
(啟動)、open
(建立連線)、message
(接收訊息)、close
(關閉連線)。於 message
事件中,伺服器會將收到的訊息加上前綴後回傳給發信人。
步驟 2:啟動 WebSocket 伺服器
確保終端在 websocket_server.php
所在路徑,並以 ServBay 中已啟用 Swoole 的 PHP 執行腳本:
php websocket_server.php
若無誤,終端會顯示:
Swoole WebSocket server is started at ws://0.0.0.0:9502
這表示 Swoole WebSocket 伺服器已成功監聽 9502 埠。
步驟 3:連線測試 WebSocket 伺服器
可以用多種方式測試 WebSocket 伺服器。
方法 A:使用瀏覽器開發者工具
現代瀏覽器開發者工具(F12 開啟)中備有「網路」或「主控台」面板,可直接測試 WebSocket。
開啟任一網頁(例如
about:blank
)。進入開發者工具,切換到「主控台 (Console)」面板。
輸入以下 JavaScript 建立 WebSocket 連線:
javascriptvar ws = new WebSocket("ws://localhost:9502"); ws.onopen = function(event) { console.log("WebSocket connection opened:", event); ws.send("Hello from Browser!"); // 連線成功後發送訊息 }; ws.onmessage = function(event) { console.log("Message from server:", event.data); // 收到訊息 }; ws.onerror = function(event) { console.error("WebSocket error:", event); // 發生錯誤 }; ws.onclose = function(event) { console.log("WebSocket connection closed:", event); // 連線關閉 }; // 任何時候都可使用 ws.send("你的訊息") 發送訊息 // 透過 ws.close() 關閉連線
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21於主控台執行後,觀察訊息與連線紀錄,同時在
websocket_server.php
執行的終端亦會看到相對應日誌。
方法 B:使用 wscat
命令列工具
wscat
是 Node.js 基礎的命令列 WebSocket 客戶端。
安裝
wscat
: 若尚無 Node.js 與 npm,請先安裝。再用 npm 全域安裝 wscat:bashnpm install -g wscat
1連線至 WebSocket 伺服器: 於終端執行:
bashwscat -c ws://localhost:9502
1成功會見到
>
提示字元。發送訊息: 直接輸入訊息並回車:
bash> Hello ServBay via wscat
1伺服器將回應訊息,於
wscat
終端會看到<
開頭的訊息:bash< Hello, you sent: Hello ServBay via wscat
1同時,運行
websocket_server.php
的終端也會顯示日誌。
中斷 wscat 連線,請按 Ctrl + C
。
注意事項
- 埠口占用: 確認 Swoole 伺服器使用的埠(如 9501、9502)沒被其他程式占用,否則將無法啟動。
- PHP 版本: 執行腳本時請用 ServBay 中已啟用 Swoole 擴充的 PHP 版本。可用
php -v
檢查目前 PHP 版本,ServBay 通常有方便的版本切換指令。 - 擴充狀態: 若啟動失敗,再次確認目前使用的 PHP 版本已於 ServBay 啟用 Swoole 並重啟讓設定生效。
- 常駐進程管理: Swoole 伺服器屬常駐記憶體進程。在正式環境,建議搭配進程管理工具(如 Supervisor、Systemd、pm2 等)守護 Swoole 程序,崩潰時自動重啟。在 ServBay 在地開發中,手動終端執行足矣。
總結
透過 ServBay,你能輕鬆啟用並運用 Swoole 擴充,在本地開發時即可架設與測試高效能 PHP 應用,不論是傳統 HTTP 服務還是現代 WebSocket 即時應用。Swoole 強大效能結合 ServBay 便捷開發環境,為 PHP 開發者開啟全新可能,協助你打造更高效、更強大的應用!立即於 ServBay 體驗 Swoole 吧!