Workerman 修改代码后无反应是因为进程未重启,需手动终止残留进程并重新启动。确认方法:用 ps 命令检查 PID 和启动时间;正确流程为 stop → pkill → start;开发期可用 inotifywait 监听自动重启。

修改 PHP 代码后 Workerman 没反应?不是缓存问题,是进程没重启
Workerman 是常驻内存的长连接服务器,它启动后会把代码一次性加载进内存,后续所有请求都走这个内存副本。改了 Worker.php 或业务逻辑文件,不重启进程,新代码根本不会被加载——这不是 opcache、不是浏览器缓存、也不是 IDE 延迟,就是进程还在跑老代码。
怎么确认是不是真没重启?看进程 PID 和启动时间
很多人以为 php start.php stop 就停干净了,其实常有残留。必须用系统命令验证:
- 执行
ps aux | grep start.php,检查是否还有php start.php start进程在运行 - 对比
ps -eo pid,lstart,cmd | grep start.php输出里的启动时间,确认是不是你改完代码之后才拉起的 - 如果看到多个同名进程,或启动时间早于你改代码的时间,说明旧进程还在扛活
正确重启流程:stop → 清残留 → start
Workerman 自带的 stop 命令有时无法彻底杀死子进程,尤其用了 daemonize = true 或子 Worker 挂起时。稳妥做法是:
- 先运行
php start.php stop - 再手动杀一次残留:
pkill -f "start.php start"(Linux/macOS)或taskkill /F /IM php.exe /T(Windows) - 最后用
php start.php start启动,加-d参数可前台运行便于观察:php start.php start -d - 注意:别用
Ctrl+C中断前台进程后直接再 start——它可能没来得及释放端口,导致Address already in use
开发期可以绕过重启?用 reload 不行,但 watch + restart 可以
Workerman 官方不支持热重载(reload 只对部分配置生效,不重载 PHP 业务代码),但你可以用工具自动监听文件变化并触发重启:
- 推荐用
inotifywait(Linux)或fswatch(macOS),配合 shell 脚本实现「改完保存就重启」 - 例如 Linux 下写个
watch.sh:while inotifywait -e modify,move_self,create ./Applications; do php start.php stop; pkill -f "start.php start"; php start.php start -d; done
- 注意:别在生产环境开这种监听,也别用
touch或修改时间戳假装更新——Workerman 不扫描文件变更
最常被忽略的一点:Workerman 的 Worker::reload() 是给平滑重启子进程用的,它不会重新 require 你的业务类文件;哪怕你在回调里手动 include,PHP 的 opcode 缓存和类加载器也会让旧版本继续生效。想看到新逻辑,唯一可靠路径就是干掉整个主进程再拉起。










