phpstorm调试workerman必须禁用守护进程、设count=1,因多进程pid动态变化导致xdebug无法继承和绑定;http触发机制对websocket/tcp无效,需xdebug_break()手动断点。

PhpStorm 调试 Workerman 必须禁用守护进程模式、限制进程数为 1,并手动触发 Xdebug 断点;否则断点永远不会命中。
为什么 PhpStorm 默认连不上 Workerman?
Workerman 启动后默认是多进程常驻内存服务,每个子进程独立运行、PID 动态变化,而 PhpStorm 的 Xdebug 是按请求或单进程绑定的。当你执行 php start.php start -d(守护模式),主进程 fork 出多个子进程后,Xdebug 配置无法自动继承到所有子进程,且 IDE 无法主动 attach 到随机 PID 的子进程上。
常见错误现象包括:
- 断点灰色不可用,提示 “No debug connection”
- 控制台无 Xdebug 日志输出,
xdebug_info()在 Worker 回调里不生效 - 即使配置了
xdebug.start_with_request = trigger,也因 WebSocket/TCP 连接不带 HTTP header 而无法触发
必须关闭守护模式 + 强制单进程启动
调试阶段绝不能用 -d 参数。正确启动方式是:
php start.php start
同时在代码中显式设为单进程:
$worker->count = 1;
这样整个服务只运行在一个 PHP 进程里,Xdebug 可稳定连接,PhpStorm 也能持续监听该进程的调试会话。
如果你用的是 ThinkPHP + ThinkWorker 插件,还需确保 config/worker_server.php 中没启用 'daemonize' => true,并临时注释掉所有 Worker::daemonize() 相关逻辑。
PhpStorm 配置要点(2026 年最新实践)
确认已安装并启用 Xdebug 3.3+(非 Zend Debugger),且 php.ini 包含以下最小配置:
xdebug.mode = debug xdebug.client_host = 127.0.0.1 xdebug.client_port = 9003 xdebug.start_with_request = yes xdebug.log = /tmp/xdebug.log
PhpStorm 中需设置:
- Preferences → PHP → Servers:添加本地服务器,Host 填
127.0.0.1,Port 填你 Web 服务端口(如 8000),但关键是要勾选 “Use path mappings” 并映射项目根目录到服务器路径 - Run → Debug → “Listen for PHP Debug Connections” 必须处于开启状态(小电话图标亮起)
- 在
$worker->onMessage或$worker->onConnect回调第一行加xdebug_break();,比依赖 URL 触发更可靠
调试时容易忽略的三个细节
Workerman 的事件回调(如 onMessage)不是 HTTP 请求入口,不会走常规路由,所以:
- 不能靠浏览器访问
http://127.0.0.1:2346触发断点——WebSocket 连接本身不携带 Xdebug cookie 或 GET 参数 - 日志写入路径默认是
workerman.log,但它和 Xdebug 日志分离;调试时建议先用var_dump($data); exit;确认流程走到哪,再上断点 - 如果用了 GatewayWorker 三进程架构,
business进程才是业务逻辑所在,但它的消息来自gateway进程 IPC 推送——此时你得在business进程脚本里单独配 Xdebug,而不是在 gateway 启动文件里
真正卡住人的从来不是“怎么配”,而是忘了 Workerman 不是传统 Web 请求模型——它没有 request/response 生命周期,调试必须回归进程本质:盯住一个 PID,让它别 fork,让它别 daemonize,然后才轮得到 IDE 插手。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











