本文目录导读:

我来详细介绍一下如何使用 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 的基本使用方法,你可以根据需求选择适合的场景进行使用,记得根据实际情况调整服务器配置和优化策略。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播