PHP 怎么用Swoole工具

wen PHP项目 2

本文目录导读:

PHP 怎么用Swoole工具

  1. 安装 Swoole
  2. 基础使用示例
  3. WebSocket 服务器
  4. TCP/UDP 服务器
  5. 协程使用
  6. 异步任务处理
  7. 进程管理
  8. 常用工具命令
  9. 配置优化
  10. 调试技巧
  11. 进程管理命令
  12. 常驻内存注意事项
  13. 总结建议

我来详细介绍一下如何使用 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();

总结建议

  1. 开发环境:开启错误显示,便于调试
  2. 生产环境:关闭错误显示,开启日志记录
  3. 性能优化:合理配置 worker 数量和 task 进程数
  4. 代码规范:注意内存管理,避免内存泄漏
  5. 测试:使用 abwrk 工具进行压力测试

这些是 Swoole 的基本使用方法,你可以根据需求选择适合的场景进行使用,记得根据实际情况调整服务器配置和优化策略。

抱歉,评论功能暂时关闭!