使用 Swoole 創建高性能 PHP 應用
什麼是 Swoole?
Swoole 是一個用於 PHP 的高性能網路通信框架,提供了非同步、多執行緒和協程等功能,使 PHP 可以像 Node.js 一樣處理高併發任務。它支持 TCP、UDP、UnixSocket、HTTP、WebSocket 等多種協議,適用於構建高性能的 Web 伺服器、微服務架構、即時通信系統等。
Swoole 的主要特性和優勢
- 高性能:Swoole 使用 C 語言編寫,性能极高,支持非同步 IO 和協程,能夠處理高併發請求。
- 豐富的功能:支持多種網路協議、定時器、進程管理、記憶體管理等功能,滿足各種開發需求。
- 容易上手:提供了簡單易用的 API 和豐富的文檔,幫助開發者快速上手。
- 擴展性強:支持自定義擴展和插件,能夠根據需求進行靈活定制。
Swoole 是構建高性能 Web 應用和即時通信系統的理想選擇,適用於從小型應用到大型企業級系統的各種專案。
安裝 Swoole
在這篇文章中,我們將介紹如何在 ServBay 環境中安裝和使用 Swoole。
TIP
ServBay 建議開發者把網站放置在/Applications/ServBay/www
目錄下,以方便管理。
步驟 1:安裝 Swoole 擴展
啟用 Swoole 擴展
ServBay 已經內建了 Swoole 擴展,用戶需要先啟用並重啟 PHP。請參考 如何啟用ServBay自帶的Swoole模組 這篇文章來啟用 Swoole 模組。
步驟 2:創建專案目錄
創建專案目錄並進入:
cd /Applications/ServBay/www
mkdir servbay-swoole-app
cd servbay-swoole-app
2
3
步驟 3:創建 Swoole 伺服器腳本
在專案目錄中創建一個 server.php
文件,編寫一個簡單的 Swoole HTTP 伺服器:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
$server = new Server("0.0.0.0", 9501);
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
});
$server->on("request", function (Request $request, Response $response) {
$response->header("Content-Type", "text/plain");
$response->end("Hello ServBay!");
});
$server->start();
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
步驟 4:運行 Swoole 伺服器
在終端中運行以下命令啟動 Swoole 伺服器:
php server.php
你將看到以下輸出:
Swoole HTTP server is started at http://0.0.0.0:9501
步驟 5:訪問 Swoole 伺服器
打開瀏覽器,訪問 http://localhost:9501
,你會看到網頁輸出 Hello ServBay!
。
使用 Swoole 構建 Web 應用
在這部分,我們將介紹如何使用 Swoole 構建一個簡單的 Web 應用。
創建控制器和路由
在專案目錄中創建一個 app
目錄,並在其中創建 controllers
和 routes
目錄:
mkdir -p app/controllers
mkdir -p app/routes
2
在 app/controllers
目錄中創建一個 HomeController.php
文件:
<?php
namespace App\Controllers;
class HomeController
{
public function index()
{
return "Welcome to ServBay!";
}
public function hello($name)
{
return "Hello, $name!";
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
在 app/routes
目錄中創建一個 web.php
文件:
<?php
use App\Controllers\HomeController;
return [
'GET /' => [HomeController::class, 'index'],
'GET /hello/{name}' => [HomeController::class, 'hello'],
];
2
3
4
5
6
7
8
更新 Swoole 伺服器腳本
更新 server.php
文件,添加路由解析和控制器調用邏輯:
<?php
use Swoole\Http\Server;
use Swoole\Http\Request;
use Swoole\Http\Response;
use FastRoute\RouteCollector;
use function FastRoute\simpleDispatcher;
require 'vendor/autoload.php';
$server = new Server("0.0.0.0", 9501);
$routes = require __DIR__ . '/app/routes/web.php';
$dispatcher = simpleDispatcher(function (RouteCollector $r) use ($routes) {
foreach ($routes as $route => $handler) {
list($method, $path) = explode(' ', $route);
$r->addRoute($method, $path, $handler);
}
});
$server->on("start", function (Server $server) {
echo "Swoole HTTP server is started at http://0.0.0.0:9501\n";
});
$server->on("request", function (Request $request, Response $response) use ($dispatcher) {
$routeInfo = $dispatcher->dispatch($request->server['request_method'], $request->server['request_uri']);
switch ($routeInfo[0]) {
case \FastRoute\Dispatcher::NOT_FOUND:
$response->status(404);
$response->end('404 Not Found');
break;
case \FastRoute\Dispatcher::METHOD_NOT_ALLOWED:
$response->status(405);
$response->end('405 Method Not Allowed');
break;
case \FastRoute\Dispatcher::FOUND:
$handler = $routeInfo[1];
$vars = $routeInfo[2];
list($class, $method) = $handler;
$response->header("Content-Type", "text/plain");
$response->end(call_user_func_array([new $class, $method], $vars));
break;
}
});
$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
安裝 FastRoute
在專案根目錄下運行以下命令安裝 FastRoute 路由庫:
composer require nikic/fast-route
運行 Swoole 伺服器
在終端中運行以下命令啟動 Swoole 伺服器:
php server.php
訪問 Web 應用
打開瀏覽器,訪問以下 URL:
http://localhost:9501/
:你會看到網頁輸出Welcome to ServBay!
。http://localhost:9501/hello/ServBay
:你會看到網頁輸出Hello, ServBay!
。
使用 Swoole 處理 WebSocket 連接
Swoole 還支持 WebSocket 協議,可以用於構建即時通信應用。我們將介紹如何使用 Swoole 處理 WebSocket 連接。
創建 WebSocket 伺服器腳本
在專案目錄中創建一個 websocket_server.php
文件,編寫一個簡單的 WebSocket 伺服器:
<?php
use Swoole\WebSocket\Server;
use Swoole\Http\Request;
use Swoole\WebSocket\Frame;
$server = new Server("0.0.0.0", 9502);
$server->on("start", function (Server $server) {
echo "Swoole WebSocket server is started at ws://0.0.0.0:9502\n";
});
$server->on("open", function (Server $server, Request $request) {
echo "connection open: {$request->fd}\n";
});
$server->on("message", function (Server $server, Frame $frame) {
echo "received message: {$frame->data}\n";
$server->push($frame->fd, "Hello, {$frame->data}");
});
$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
運行 WebSocket 伺服器
在終端中運行以下命令啟動 WebSocket 伺服器:
php websocket_server.php
你將看到以下輸出:
Swoole WebSocket server is started at ws://0.0.0.0:9502
連接 WebSocket 伺服器
可以使用瀏覽器中的 WebSocket 客戶端或者其他 WebSocket 客戶端工具(例如 wscat
)連接到 WebSocket 伺服器。
使用 wscat
連接
安裝
wscat
:bashnpm install -g wscat
1連接到 WebSocket 伺服器:
bashwscat -c ws://localhost:9502
1發送消息:
bash> Hello ServBay
1
你將看到伺服器返回的消息:
< Hello, Hello ServBay
通過以上步驟,您成功創建並運行了一個 Swoole 專案,並使用 Swoole 提供的功能來處理 HTTP 請求和 WebSocket 連接。Swoole 的高性能和豐富功能使其成為構建高併發應用的理想選擇。