Workerman 5.2.3 默认支持协程,但需手动选择并配置 Swoole/Swow/Revolt 其中之一作为事件循环驱动,且必须配合协程安全的客户端(如 workerman/http-client)使用,禁用原生阻塞函数。

Workerman 5.2.3 默认支持协程,但是否真正启用、能否安全使用,取决于你选用的事件循环驱动和代码写法。它本身不自带协程运行时,而是通过兼容多种底层协程引擎(Swoole / Swow / Fiber/Revolt)来提供协程能力。关键不是“能不能用”,而是“怎么配对、怎么写才不出错”。
确认并选择协程驱动
Workerman 5.2.3 支持三类主流协程运行时,同一 Worker 进程只能选其一: - Swoole:需安装 `swoole` 扩展(v6.0+),自动协程化大部分阻塞函数(如 `file_get_contents`、`curl_exec`) - Swow:需安装 `swow` 扩展(PHP ≥ 8.0),性能接近 Swoole,但需手动替换阻塞调用为 Swow 原生 API - Fiber + Revolt:纯 PHP 实现,无需扩展,但不自动协程化任何原生 PHP 函数,遇到 `sleep()`、`file_get_contents()` 会直接阻塞整个进程你必须在 Worker 创建后、Worker::runAll() 前显式指定驱动:
use Workerman\Events\Swoole;
use Workerman\Events\Swow;
use Workerman\Events\Revolt;
$worker = new Worker('tcp://0.0.0.0:1234');
$worker->eventLoop = Swoole::class; // 或 Swow::class 或 Revolt::class在回调中自然使用协程
Workerman 5.2.3 在 `onConnect`、`onMessage`、`onClose` 等回调中**自动为你创建协程上下文**(只要 eventLoop 已正确设置)。你不需要手动调用 `Coroutine::create()`,直接写 `await` 即可:$worker->onMessage = function($connection, $data) {
// ✅ 正确:使用 workerman/http-client(协程安全)
$client = new \Workerman\Http\Client();
$response = await $client->get('https://httpbin.org/delay/1');
$body = await $response->getBody();
$connection->send("Received: " . strlen($body) . " bytes");
// ❌ 错误(仅 Fiber/Revolt 下):file_get_contents 会阻塞
// $content = file_get_contents('https://httpbin.org/delay/1');
// ✅ 正确替代(所有驱动通用):用协程客户端
// $client = new \Workerman\Http\Client();
// $response = await $client->get(...);
};配套组件必须协程兼容
协程不是魔法——它只调度“可挂起”的操作。你必须用协程版客户端,否则协程优势归零: - HTTP 请求:用 `workerman/http-client`(非 `curl_exec` 或 `file_get_contents`) - MySQL 查询:用 `workerman/mysql`(非 `PDO` 或 `mysqli`) - Redis 操作:用 `workerman/redis` 或 Swow/Swoole 原生客户端(非 `phpredis`) - 文件读写:避免 `file_get_contents`/`file_put_contents`;高并发下改用异步日志队列或 `Swow\IO\Stdio`启动与验证
- 启动时必须前台运行(禁用 `-d` daemon 模式),尤其 Swow/Fiber 驱动不支持 fork 后协程上下文继承 - 启动后查看控制台输出,确认 `event-loop` 显示为 `swoole`、`swow` 或 `revolt` - 写个简单测试:在 `onMessage` 中 `await` 一个 1 秒 HTTP 请求,同时用 `ab` 或 `wrk` 并发 1000 连接,观察 CPU 和延迟是否平稳——若卡顿或超时,大概率混用了阻塞调用基本上就这些。核心就三点:选对驱动、用对客户端、别碰原生阻塞函数。

















