在 ServBay 中使用 Swoole 建構高效能 PHP 應用
ServBay 是專為開發者打造的本地網頁開發環境,預載多種程式語言環境、資料庫與工具,致力於簡化本地開發流程。本文將重點介紹如何在 ServBay 環境中善用 Swoole 擴充套件,為 PHP 應用注入高效能網路服務能力。
何謂 Swoole?
Swoole 是為 PHP 設計的協程(Coroutine)基礎、並行高效能網路通訊引擎。採用純 C 語言開發,賦予 PHP 非同步、並行以及協程通訊能力。透過 Swoole,PHP 開發者不再受限於傳統網頁伺服器(如 Apache/Nginx + PHP-FPM)的請求-回應模型,可高效處理高並發任務,舉例來說:建立常駐記憶體的網頁伺服器、非同步任務處理、即時通訊服務(如 WebSocket)等。
Swoole 的核心特色:
- 高效能: 以 C 語言底層實作,支援非同步 I/O、多進程/多執行緒。
- 協程: 提供輕量協程,讓同步程式碼可非同步執行,簡化非同步程式設計。
- 豐富協定支援: 原生支援 TCP/UDP/HTTP/WebSocket 等多種網路協定。
- 易用性: API 設計貼合 PHP 習慣,簡單直覺。
- 常駐記憶體: 應用程式可作為常駐進程執行,減少傳統 PHP 每次請求都需初始化環境的負擔。
有了 Swoole,PHP 不再僅是網頁開發腳本語言,更能勝任多種高效能網路應用場景。
在 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 預設建議將網站及專案檔案放在以下路徑,有助於網站管理及自動配置:
- macOS:
/Applications/ServBay/www
- Windows:
C:\ServBay\www
本文章範例也會以此路徑為基準。
建立簡易 Swoole HTTP 伺服器
接下來,讓我們建立一個基本 Swoole HTTP 伺服器,體驗 Web 請求處理流程。
步驟 1:建立專案目錄
打開終端機,新建並進入專案目錄。依 ServBay 建議將其放置於下列路徑:
macOS:
bash
cd /Applications/ServBay/www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
Windows:
cmd
cd C:\ServBay\www
mkdir servbay-swoole-http
cd servbay-swoole-http
1
2
3
2
3
步驟 2:撰寫伺服器程式
於 servbay-swoole-http
資料夾內新建 server.php
,加入以下內容:
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();
1
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
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
這段程式會建立一個 Swoole HTTP 伺服器,監聽 9501 端口。收到請求時回傳 Hello ServBay!
,若取用 /info
路徑則回覆請求資訊。
步驟 3:啟動 Swoole 伺服器
確認目前終端機位於 servbay-swoole-http
目錄下,使用已啟用 Swoole 擴充套件的 PHP 版本執行:
bash
php server.php
1
執行正確時終端會顯示:
bash
Swoole HTTP server is started at http://0.0.0.0:9501
1
表示 Swoole HTTP 伺服器已在背景運行並監聽 9501 埠口。
步驟 4:瀏覽器訪問 Swoole 伺服器
開啟瀏覽器,輸入下列網址:
http://localhost:9501
http://localhost:9501/info
分別可看到網頁顯示 Hello ServBay!
,以及請求資訊內容。
如需停止伺服器,請至終端機執行畫面按下 Ctrl + C
。
利用 Swoole 處理 WebSocket 連線
Swoole 原生支援 WebSocket 協定,非常適合打造即時通訊應用,例如聊天室、遊戲伺服器、即時推播等。
步驟 1:撰寫 WebSocket 伺服器程式
於你的專案路徑(如 servbay-swoole-http
,或另建目錄如 servbay-swoole-websocket
)建立 websocket_server.php
,程式如下:
專案路徑:
- macOS:
/Applications/ServBay/www/servbay-swoole-http
- Windows:
C:\ServBay\www\servbay-swoole-http
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();
1
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
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
以上程式會建立 Swoole WebSocket 伺服器,監聽 9502 埠口並定義主要事件回呼:start
(啟動)、open
(新連線)、message
(訊息)、close
(關閉)。在 message
事件中,伺服器會加前綴後將訊息回送給發送者。
步驟 2:啟動 WebSocket 伺服器
在終端機切換到存放 websocket_server.php
的資料夾,利用 ServBay 已啟用 Swoole 擴充套件的 PHP 版本啟動:
bash
php websocket_server.php
1
執行正確時終端顯示:
bash
Swoole WebSocket server is started at ws://0.0.0.0:9502
1
即表示 WebSocket 伺服器已監聽 9502 埠。
步驟 3:連線至 WebSocket 伺服器
可採多種方式測試 WebSocket 連線:
方式 A:使用瀏覽器開發者工具
大多數現代瀏覽器的開發者工具(F12 熱鍵)都有「網路(Network)」或「主控台(Console)」功能,可用來驗證 WebSocket 連線。
開啟任意網頁(如
about:blank
)。開啟開發者工具,切至「主控台(Console)」。
輸入下列 JavaScript 建立連線:
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 全域安裝:bashnpm install -g wscat
1連線至 WebSocket 伺服器: 在終端機輸入:
bashwscat -c ws://localhost:9502
1連線成功後會看到
>
提示符。傳送訊息: 在提示符後打入訊息並按 Enter:
bash> Hello ServBay via wscat
1收到伺服器回覆後,終端機顯示(通常
<
開頭):bash< Hello, you sent: Hello ServBay via wscat
1同時
websocket_server.php
的終端機也會記錄相應的日誌。
如需中斷 wscat
,按下 Ctrl + C
即可。
注意事項
- 端口衝突: 請確認 Swoole 伺服器監聽的端口(如 9501, 9502)未被其他程式佔用,否則啟動失敗。
- PHP 版本: 執行程式時請使用已啟動 Swoole 擴充套件的 PHP 版本,可用
php -v
檢查目前命令列使用版本。ServBay 通常提供便捷命令切換 PHP 版本。 - 擴充套件狀態: 若啟動失敗,請再次確認 Swoole 擴充套件已於 ServBay 為所用 PHP 版本正確啟用,且重新啟動 ServBay 或 PHP 服務使配置生效。
- 常駐進程管理: Swoole 伺服器屬於常駐記憶體進程。生產環境建議使用進程管理工具(如 Supervisor、Systemd、pm2 等)守護 Swoole,保障崩潰可自動重啟。在 ServBay 開發環境下,於終端手動執行已相當便利。
小結
透過 ServBay,你能輕鬆啟用與運用 Swoole 擴充套件,於本地環境建構及測試高效能 PHP 應用,無論是傳統 HTTP 服務,抑或現代 WebSocket 即時通訊。結合 Swoole 強大效能與 ServBay 方便易用的開發體驗,為 PHP 開發者開啟嶄新可能,助你打造更高效、更強大的應用程式。立即於 ServBay 開始體驗 Swoole 的威力吧!