结论:网易游戏笔试专考协程生命周期、连接池污染、热更新失效;协程内禁用global/static存状态,须用context::set;原生mysqli/pdo不协程安全,须用swoole\coroutine\mysql或协程pdo封装;热更新需inotifywait+usr1或--watch,非保存即生效;file_get_contents等同步函数在协程中会阻塞worker。

直接说结论:网易游戏笔试里考 Swoole,90% 不考安装或语法,专盯协程生命周期、连接池污染、热更新失效这三块。
协程内不能用 global 或静态变量存状态
常见错误现象:协程 A 写了 $GLOBALS['user_id'] = 123,协程 B 读出来却是 456,甚至报 undefined index。
原因很简单:global 和 static 变量在 Swoole Worker 进程内是跨协程共享的,不是协程隔离的。一个协程改了,另一个马上看到——这不是你想要的“本次请求上下文”。
实操建议:
- 改用
Swoole\Coroutine::getContext()存当前协程私有数据,比如Context::set('user_id', 123) - 避免在协程函数里写
static $cache = [],它会在多次请求间残留 - TP6 + think-swoole 下,
app()->make()返回的容器实例默认是单例,必须手动 clone 或用makeWith()注入新上下文
mysqli 和 PDO 原生连接不能直接丢进协程
常见错误现象:协程里 new 一个 mysqli,执行两次 query(),第二次直接失败,报 MySQL server has gone away。
原因:原生 MySQL 连接不是协程安全的。Swoole 协程调度时会切走,但底层 socket 连接可能被关闭或复用错乱;更关键的是,它不支持连接池自动回收和重连。
实操建议:
- 必须用
Swoole\Coroutine\MySQL或co-mysql封装类,它内部做了协程切换挂起/恢复处理 - 若用 PDO,得配合
swow-pdo或封装成协程友好的连接工厂,不能直接 new PDO - 连接池配置别只写
max_idle_time,务必加min_idle防冷启动延迟,网易游戏题库里常考这个参数组合
修改代码后 php bin/hyperf.php start 没反应?热更新没生效
常见错误现象:改完 app/Controller/UserController.php,curl 请求结果还是旧的,ps aux | grep php 看 Worker 进程 PID 没变。
原因:Swoole 是常驻内存模型,Worker 进程加载一次代码后就不再 reload,文件变更不会自动触发重启——这点和 PHP-FPM 完全相反。
实操建议:
- 开发期必须开
--watch(Hyperf)或inotifywait + kill -USR1(原生 Swoole),别指望编辑器保存就生效 - 上线后热更新靠
kill -USR1 {master_pid},但要注意:它只 reload Worker,Manager 和 Master 不动,所以全局配置(如ini_set)改了得全进程重启 - 网易真题里出现过陷阱:让考生写一个
reload.sh脚本,要求判断worker_num是否变化后再发信号,否则可能 reload 失败静默
真正难的不是写协程,而是记住哪些东西“看起来能用,其实一并发就崩”——比如 file_get_contents、curl_exec、sleep(),这些默认都是同步阻塞,在协程里直接用等于废掉整个 Worker。得换 Co\Http\Client、Co\Socket、Co::sleep() 才行。这点容易被忽略,但线上事故最多就出在这儿。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











