hyperf 默认协程运行,需确保 swoole enable_coroutine 为 true 并调用 swoole\runtime::enablecoroutine(true);必须使用协程安全组件(如 hyperf\dbconnection、redis、httpclient);禁用 sleep 等阻塞操作;可通过 /server/info、co::getcid() 并发验证及 strace 观察 epoll_wait 确认协程生效。

Hyperf 默认就是协程模式运行的,无需额外“开启”开关,关键在于确保运行环境正确配置协程支持。
确认 Swoole 协程 Hook 已启用
Hyperf 依赖 Swoole 的协程能力,必须在 Swoole 启动时启用协程 Hook,否则 I/O 操作(如 MySQL、Redis、HTTP 请求)不会自动协程化。
- 检查
config/autoload/server.php中的swoole配置,确保enable_coroutine设为 true(Swoole v4.4+ 默认开启,但建议显式声明) - 在
config/autoload/swoole.php或启动前调用Swoole\Runtime::enableCoroutine(),推荐在bin/hyperf.php最顶部添加:
该调用会自动对 TCP/UDP/Stream/Socket/File 等底层操作进行协程调度拦截。
使用协程安全的客户端组件
即使协程环境就绪,若继续使用同步阻塞客户端(如原生 PDO、curl_exec),仍会阻塞整个协程。Hyperf 提供了开箱即用的协程版组件:
-
数据库:用
Hyperf\DbConnection(基于swoole_mysql或pdo_mysql协程驱动),避免直接 new PDO -
Redis:用
Hyperf\Redis\Redis(封装Swoole\Coroutine\Redis),非phpredis -
HTTP 客户端:用
Hyperf\HttpClient\HttpClient(基于Swoole\Coroutine\Http\Client),非file_get_contents或 Guzzle 同步模式
避免在协程中执行阻塞操作
以下行为会破坏协程并发性,应主动规避:
- 调用
sleep()、usleep()→ 改用co::sleep() - 使用
time_nanosleep()、stream_select()等系统调用 → 优先使用协程版替代方案 - 在协程中执行耗时 CPU 计算(如大数组排序、正则回溯)→ 可通过
Hyperf\Contract\StdoutLoggerInterface日志观察是否出现协程卡顿 - 混用
fork或多进程模型 → 协程与进程不兼容,Hyperf 默认是单进程多协程模型
验证协程是否正常工作
可通过简单压测或日志确认协程生效:
- 启动服务后访问
/server/info(需启用hyperf/server组件),查看coroutine_num和当前协程 ID 变化 - 写一个接口,内含两个并发 HTTP 请求,打印
Co::getcid(),若两次输出相同 CID 且响应时间接近(非串行叠加),说明协程并发成功 - 使用
strace -p {pid}观察是否大量出现epoll_wait而极少read/write阻塞调用










