本文目录导读:

我来详细介绍一下如何使用 Swoole 工具,从安装到实际应用。
安装 Swoole
Linux/Mac 安装
# 使用 PECL 安装 pecl install swoole # 或者编译安装 git clone https://github.com/swoole/swoole-src.git cd swoole-src phpize ./configure make && make install # 启用扩展 echo "extension=swoole.so" >> php.ini
检查安装
php -m | grep swoole php --ri swoole
基础使用示例
HTTP 服务器
<?php
// http_server.php
$http = new Swoole\Http\Server('0.0.0.0', 9501);
$http->on('request', function ($request, $response) {
$response->header('Content-Type', 'text/plain');
$response->end("Hello Swoole\n");
});
$http->start();
运行启动
# 运行服务器 php http_server.php # 测试 curl http://localhost:9501
WebSocket 服务器
<?php
// websocket_server.php
$server = new Swoole\WebSocket\Server('0.0.0.0', 9502);
$server->on('open', function ($server, $request) {
echo "连接建立: {$request->fd}\n";
});
$server->on('message', function ($server, $frame) {
echo "收到消息: {$frame->data}\n";
$server->push($frame->fd, "服务器回复: {$frame->data}");
});
$server->on('close', function ($server, $fd) {
echo "连接关闭: {$fd}\n";
});
$server->start();
TCP/UDP 服务器
<?php
// tcp_server.php
$server = new Swoole\Server('0.0.0.0', 9503, SWOOLE_PROCESS, SWOOLE_SOCK_TCP);
$server->on('connect', function ($server, $fd) {
echo "客户端连接: {$fd}\n";
});
$server->on('receive', function ($server, $fd, $reactor_id, $data) {
$server->send($fd, "收到数据: {$data}");
});
$server->on('close', function ($server, $fd) {
echo "客户端关闭: {$fd}\n";
});
$server->start();
协程使用
<?php
// coroutine_example.php
use Swoole\Coroutine;
use function Swoole\Coroutine\run;
run(function () {
// 创建多个协程
$result = Coroutine\parallel(3, function ($i) {
Coroutine::sleep(1); // 模拟耗时操作
return "任务{$i}完成";
}, [1, 2, 3]);
print_r($result);
});
异步任务处理
<?php
// async_task.php
$server = new Swoole\Http\Server('0.0.0.0', 9504);
// 任务处理
$server->on('task', function ($server, $task_id, $from_id, $data) {
echo "处理任务: {$task_id}\n";
sleep(2); // 模拟耗时任务
$server->finish("任务完成: {$task_id}");
});
// 任务完成回调
$server->on('finish', function ($server, $task_id, $data) {
echo "任务完成: {$data}\n";
});
// 接收请求
$server->on('request', function ($request, $response) use ($server) {
// 投递异步任务
$task_id = $server->task("需要处理的数据");
$response->end("任务已投递: {$task_id}");
});
// 启动任务进程
$server->set([
'task_worker_num' => 4, // 任务进程数
]);
$server->start();
进程管理
<?php
// process_example.php
use Swoole\Process;
$process = new Process(function ($worker) {
echo "子进程: " . $worker->pid . "\n";
$worker->write("来自子进程的数据\n");
});
$process->start();
// 父进程读取数据
echo "父进程收到: " . $process->read() . "\n";
// 等待子进程结束
Process::wait();
常用工具命令
# 查看服务器状态
php -r "var_dump(swoole_version());"
# 创建服务器实例
php -r "$server = new Swoole\Server('127.0.0.1', 9505); echo '服务器创建成功';"
# 查看当前连接
ss -nlt | grep 9501
# 性能监控
top -p $(pidof php)
配置优化
<?php
// server_config.php
$server = new Swoole\Http\Server('0.0.0.0', 9506);
$server->set([
'worker_num' => 4, // 工作进程数
'task_worker_num' => 4, // 任务进程数
'max_connections' => 10000, // 最大连接数
'max_request' => 1000, // 进程最大处理请求数
'open_tcp_nodelay' => true, // TCP 优化
'daemonize' => false, // 是否守护进程
'log_file' => './swoole.log', // 日志文件
'log_level' => 2, // 日志级别
'heartbeat_idle_time' => 600, // 心跳检测时间
'heartbeat_check_interval' => 60, // 心跳检测间隔
]);
$server->on('request', function ($request, $response) {
$response->header('Content-Type', 'application/json');
$response->end(json_encode([
'code' => 0,
'message' => '成功',
'data' => time()
]));
});
$server->start();
调试技巧
<?php
// debug_example.php
// 开启调试模式
ini_set('display_errors', 1);
error_reporting(E_ALL);
$http = new Swoole\Http\Server('0.0.0.0', 9507);
$http->on('request', function ($request, $response) {
// 打印请求信息
var_dump($request->get);
var_dump($request->post);
// 设置响应头
$response->header('Content-Type', 'text/html');
// 输出错误信息
if (isset($request->get['error'])) {
trigger_error('测试错误', E_USER_WARNING);
}
$response->end('<h1>Hello World!</h1>');
});
$http->start();
进程管理命令
# 查看进程 ps aux | grep swoole # 停止服务器(后台运行时) kill -9 $(pgrep -f swoole_server.php) # 平滑重启 kill -USR1 $(cat server.pid) # 查看内存使用 pmap $(pidof php) | head -20
常驻内存注意事项
<?php
// 防止内存泄漏
$http = new Swoole\Http\Server('0.0.0.0', 9508);
$http->set([
'max_request' => 1000, // 处理1000个请求后自动重启
'reload_async' => true, // 异步重启
]);
$http->on('request', function ($request, $response) {
// 清理临时变量
// 避免全局变量无限增长
// 定期清理缓存
$data = [];
$data[] = trim($request->get['name'] ?? 'default');
$response->end(json_encode($data));
});
$http->start();
总结建议
- 开发环境:开启错误显示,便于调试
- 生产环境:关闭错误显示,开启日志记录
- 性能优化:合理配置 worker 数量和 task 进程数
- 代码规范:注意内存管理,避免内存泄漏
- 测试:使用
ab或wrk工具进行压力测试
这些是 Swoole 的基本使用方法,你可以根据需求选择适合的场景进行使用,记得根据实际情况调整服务器配置和优化策略。