PHP 高性能异步协程 Swoole 并发与异步I/O处理

AI 概述
Swoole 是 PHP 高性能扩展,封装异步非阻塞网络 I/O 服务器,支持多进程/线程模型,亮点是混合模式,降低并发开发门槛且保持高性能。其多进程模型含 Reactor(线程处理网络事件)、Worker(进程处理业务逻辑)、Task(进程处理阻塞任务)。异步 I/O 核心是非阻塞操作 + 事件通知。还介绍了协程化 I/O、异步 TCP 客户端示例,以及高并发 HTTP 服务器示例,通过异步 MySQL 查询展示并发处理能力。
目录
文章目录隐藏
  1. 概述
  2. 并发架构
  3. 异步 I/O
  4. 网络 I/O

PHP 高性能异步协程 Swoole 并发与异步 I/O 处理

概述

Swoole 作为 PHP 的高性能扩展,在底层封装了一个高效的异步非阻塞网络 I/O 服务器(基于 epoll/kqueue 等多路复用机制),并支持多进程/多线程模型。

这让 PHP 开发者可以专注于业务逻辑(如事件回调处理),而无需纠结底层 I/O 细节。相比纯异步框架如 Nginx(事件驱动静态服务器)、Tornado(Python 的异步 Web 框架)或 Node.js(单线程事件循环),Swoole 的最大亮点在于其混合模式:既能全异步运行,又能通过协程实现“伪同步”编程。这大大降低了并发开发的门槛,同时保持高性能。

并发架构

多进程模型 server.php

<?php
/**
 * @desc 多进程模型(Master-Worker 模式)
 * @author Tinywan(ShaoBo Wan)
 */
declare(strict_types=1);

$server = new Swoole\Server('0.0.0.0', 9501);

// 配置进程数
$server->set([
    'worker_num' => 4,// 4 个 Worker 进程
    'reactor_num' => 2,// 2 个 Reactor 线程
    'task_worker_num' => 2// 2 个 Task 进程
]);

//监听连接进入事件。
$server->on('Connect', function ($server, $fd) {
    echo"[0] Client: Connect.\n";
});

// Worker 进程处理请求(监听数据接收事件)
$server->on('receive', function ($server, $fd, $reactor_id, $data) {
    //投递异步任务
    $task_id = $server->task($data);
    echo"[1] Dispatch AsyncTask: id={$task_id}\n";

    return $server->send($fd, "Server: {$data}");
});

// Task 进程处理耗时任务。处理异步任务(此回调函数在 task 进程中执行)
$server->on('task', function ($serv, $task_id, $reactor_id, $data) {
    sleep(3);// 模拟耗时操作
    echo"[2] New AsyncTask[id={$task_id}]" . PHP_EOL;
    //返回任务执行的结果
    $serv->finish("{$data} -> OK");
});

//处理异步任务的结果(此回调函数在 worker 进程中执行)。
$server->on('Finish', function ($serv, $task_id, $data) {
    echo"[3] AsyncTask[{$task_id}] Finish: {$data}" . PHP_EOL;
});

$server->start();

执行程序(推荐使用 swoole-cli):

swoole-cli.exe server.php

在命令行下运行 server.php 程序,启动成功后可以使用 netstat 工具看到已经在监听 9501 端口。

使用 telnet/netcat 工具连接服务器。

telnet 127.0.0.1 9501

进入命令模式 ctrl + ](用 windows 下的 telnet 登录到该端口的时候,每按一个键就会发送到 socket 中去)

欢迎使用 Microsoft Telnet Client

Escape 字符为 'CTRL+]'

Microsoft Telnet> send Hello
发送字符串 Hello
Microsoft Telnet> send Tinywan
发送字符串 Tinywan

执行程序打印信息

swoole-cli.exe server.php

[0] Client: Connect.
[1] Dispatch AsyncTask: id=0
[2] New AsyncTask[id=0]
[3] AsyncTask[0] Finish: Hello -> OK
[1] Dispatch AsyncTask: id=1
[2] New AsyncTask[id=1]
[3] AsyncTask[1] Finish: Tinywan -> OK

进程模型的关键点详解

  1. Reactor:线程处理网络事件(基于 epoll)。Reactor 是事件循环(Event Loop)的“监听者”,专职监控网络 Socket 的 I/O 事件(如连接到达、数据可读/可写)。它运行在独立的 Reactor 线程中,使用 epoll_wait() 等系统调用高效轮询数万连接,而不阻塞其他进程。
  2. Worker:进程处理业务逻辑。Worker 是 Swoole 的“主力军”,每个 Worker 进程运行独立的 Reactor 循环,负责接收 Reactor 分发的事件,并执行核心业务逻辑(如解析 HTTP 请求、调用数据库)。默认多进程模式,利用多核 CPU 并行。
  3. Task:进程处理阻塞任务(与 Worker 进程分离)。Task Worker 是专用进程池,专为阻塞/耗时任务设计(如邮件发送、复杂计算、第三方 API 调用)。它与主 Worker 分离,避免阻塞核心 I/O 路径。

异步 I/O

在 Swoole(或类似事件驱动框架)中,异步 I/O 的核心是非阻塞操作 + 事件通知,避免了传统阻塞 I/O 的线程/进程等待开销。底层依赖操作系统提供的 I/O 多路复用(如 epoll),结合用户态事件循环,实现高效的“就绪再处理”。

异步读取文件

// 一键开启协程 Hook
Swoole\Runtime::enableCoroutine();

// 异步文件读取(非阻塞)
$content = file_get_contents("large_file.txt");
var_dump($content);

协程化 I/O

go(function () {
    // 协程 HTTP 请求
    $http = new Swoole\Coroutine\Http\Client('tinywan.com', 80);
    $http->get('/api/webman');
    echo $http->body;
});

网络 I/O

异步 TCP 客户端

use Swoole\Coroutine\Client;go(function () {
    $client = new Client(SWOOLE_SOCK_TCP);
    if (!$client->connect('127.0.0.1', 9501, 0.5)) {
        echo"connect failed. Error: {$client->errCode}\n";
    }
    // 并发发送 100 个请求
    for ($i = 1; $i <= 100; $i++) {
        $client->send("hello world\n");
        Co::sleep(0.1);// 模拟间隔
    }
    echo $client->recv();
    $client->close();
});

高并发 HTTP 服务器

declare(strict_types=1);

$http = new Swoole\Http\Server('0.0.0.0', 9501);

$http->on('Request', function ($request, $response) {
    // 异步 MySQL 查询
    $mysql = new mysqli('127.0.0.1', 'root', '123456', 'nacos', 3308);
    var_dump($mysql);
    // 并发执行多个查询
    $results = [
        'user' => $mysql->query('SELECT * FROM users LIMIT 10')->fetch_assoc(),
        'product' => $mysql->query('SELECT * FROM tenant_info LIMIT 5')->fetch_assoc()
    ];
    $response->header('Content-Type', 'text/html; charset=utf-8');
    $response->end(json_encode($results));
});

$http->start();

以上关于PHP 高性能异步协程 Swoole 并发与异步I/O处理的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。

「点点赞赏,手留余香」

1

给作者打赏,鼓励TA抓紧创作!

微信微信 支付宝支付宝

还没有人赞赏,快来当第一个赞赏的人吧!

声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » PHP 高性能异步协程 Swoole 并发与异步I/O处理

发表回复