PHP 异步编程:使用 Swoole 实现高并发任务处理

分类:后端开发 时间:2026-02-24 浏览:1
1

一、同步 VS 异步:PHP 的性能瓶颈

传统 PHP-FPM 是 “同步阻塞” 模型:

  • 每个请求对应一个 FPM 进程,进程处理完请求后释放;

  • 若请求中包含耗时操作(如发送邮件、调用第三方接口、文件上传),进程会阻塞等待,无法处理其他请求;

  • 高并发下,FPM 进程数耗尽,新请求排队,响应变慢。

异步编程:耗时操作交给后台处理,主进程立即返回响应,提升并发能力。

二、Swoole 基础

Swoole 是 PHP 的异步扩展,支持协程、异步 IO、进程 / 线程管理:

1. 安装 Swoole
# 安装依赖
yum install gcc gcc-c++ make autoconf libtool pcre-devel openssl-devel
# 编译安装
pecl install swoole
# 启用扩展(修改php.ini)
echo "extension=swoole.so" >> /etc/php.ini
# 验证
php -m | grep swoole
2. 核心概念
  • 协程:轻量级线程,一个进程可创建上万协程,切换开销极低;

  • 事件循环:Swoole 的核心,监听 IO 事件(如网络、文件),异步处理;

  • 异步任务:将耗时操作投递到 TaskWorker 进程处理,不阻塞主进程。

三、Swoole 实战案例

案例 1:异步邮件发送
<?php
// 创建Swoole HTTP服务器
$http = new Swoole\Http\Server("0.0.0.0", 9501);

// 设置服务器参数
$http->set([
    'worker_num' => 4, // 工作进程数
    'task_worker_num' => 2 // 任务进程数
]);

// 接收HTTP请求
$http->on('request', function ($request, $response) use ($http) {
    // 获取用户注册数据
    $username = $request->post['username'];
    $email = $request->post['email'];

    // 投递异步任务(发送邮件)
    $taskId = $http->task([
        'username' => $username,
        'email' => $email
    ]);

    // 立即返回响应
    $response->header('Content-Type', 'application/json');
    $response->end(json_encode([
        'code' => 200,
        'message' => '注册成功,邮件将稍后发送',
        'task_id' => $taskId
    ]));
});

// 处理异步任务
$http->on('task', function ($serv, $taskId, $workerId, $data) {
    // 模拟发送邮件(耗时操作)
    sleep(3);
    $username = $data['username'];
    $email = $data['email'];
    // 实际项目中替换为真实邮件发送逻辑
    file_put_contents('mail.log', "向{$email}发送注册邮件:恭喜{$username}注册成功!\n", FILE_APPEND);
    // 返回任务结果
    return "邮件发送成功";
});

// 任务完成回调
$http->on('finish', function ($serv, $taskId, $data) {
    echo "任务{$taskId}完成:{$data}\n";
});

// 启动服务器
$http->start();
?>

运行脚本:php server.php,访问http://localhost:9501提交注册请求,会立即返回响应,3 秒后邮件日志生成。

案例 2:定时任务
<?php
// 创建Swoole定时器
$timer = Swoole\Timer::tick(5000, function () {
    // 每5秒执行一次数据统计
    $pdo = new PDO("mysql:host=localhost;dbname=php_demo;charset=utf8", "root", "");
    $stmt = $pdo->query("SELECT COUNT(*) as total FROM users");
    $total = $stmt->fetch()['total'];
    $time = date('Y-m-d H:i:s');
    file_put_contents('stat.log', "{$time} - 用户总数:{$total}\n", FILE_APPEND);
    echo "定时任务执行完成:{$time}\n";
});

// 运行1分钟后停止定时器
Swoole\Timer::after(60000, function () use ($timer) {
    Swoole\Timer::clear($timer);
    echo "定时器已停止\n";
});

// 保持进程运行
while (true) {
    sleep(1);
}
?>

四、Swoole 使用注意事项

  1. 协程安全:避免在协程中使用全局变量,如需共享数据,使用Swoole\Coroutine\Channel

  2. 框架兼容:Laravel/Symfony 等框架需适配 Swoole,推荐使用 Hyperf/EasySwoole 等基于 Swoole 的框架;

  3. 内存管理:异步任务中及时释放资源(如数据库连接),避免内存泄漏;

  4. 异常处理:在协程 / 任务中添加 try-catch,避免单个任务异常导致进程退出。

文章链接:http://www.qwkf.cn//houduan/27.html
文章标题:PHP 异步编程:使用 Swoole 实现高并发任务处理

相关阅读