hyperf 默认协程模式运行,无需手动开启;关键在于使用正确命令(server:watch而非已废弃的watch)、确保swoole enable_coroutine为true并调用swoole\runtime::enablecoroutine(true),且禁用非协程安全操作。

Hyperf 项目在 PhpStorm 中运行,根本不需要“开启协程”——它默认就是协程模式,关键在于别用错命令、别配错环境,否则协程会 silently 失效。
php bin/hyperf.php watch 和 server:watch 有什么区别
很多人以为 php bin/hyperf.php watch 是热更新命令,其实它是 Hyperf 1.x 时代的旧命令,2.x+ 已废弃;当前唯一受支持的热更新启动方式是 php bin/hyperf.php server:watch。
-
watch命令不加载server组件,无法启动 HTTP 服务,只做文件监听 + 进程重启,但不会触发协程初始化逻辑 -
server:watch是hyperf/watcher提供的正式命令,会完整走一遍 Swoole Server 启动流程,包括调用Swoole\Runtime::enableCoroutine(true) - 如果执行
watch后访问接口报Connection refused或日志里没看到Server started,基本就是用了错误命令
PhpStorm File Watcher 配合 reload.sh 容易踩的坑
File Watcher 是可行方案,但极易因权限或路径问题失败,尤其在 macOS 或 WSL 下。
-
reload.sh中的cd $basepath必须存在,否则php hyperf.php start会因工作目录错误找不到 autoload 或 config -
../runtime/hyperf.pid文件路径要和config/autoload/server.php中'pid_file' => BASE_PATH . '/runtime/hyperf.pid'保持一致 - PhpStorm 默认以当前项目根目录为工作目录执行脚本,若
bin/reload.sh被放在子目录下,$ProjectFileDir$可能指向错误位置,建议统一用$ProjectFileDir$/bin/reload.sh - macOS 上
kill信号可能被 SIP 拦截,可改用pkill -f "php.*hyperf.php"替代cat ... | xargs kill
server:watch 启动后协程没生效?检查这三个点
即使命令正确,协程也可能因配置缺失而退化为同步模型。
- 确认
config/autoload/swoole.php或启动前显式调用了Swoole\Runtime::enableCoroutine(true)(Hyperf 3.x 推荐放在bin/hyperf.php最顶部) - 检查
config/autoload/server.php中'settings' => ['enable_coroutine' => true]是否设置,Swoole v5.0+ 默认开启,但显式声明更稳妥 - 禁用所有非协程组件:比如直接 new PDO、用
file_get_contents发 HTTP 请求、调用sleep()—— 这些会让整个协程挂起,Co::getcid()不变,但响应时间变长
真正麻烦的不是怎么启动,而是启动后你以为协程在跑,其实 I/O 全卡在同步层。验证必须落到具体行为上:并发请求是否共用同一个 Co::getcid()、strace 是否看到 epoll_wait 而非 read/write 阻塞、MySQL 查询是否复用连接池 —— 别只看日志有没有 “coroutine” 字样。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











