使用 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 的高性能和丰富功能使其成为构建高并发应用的理想选择。