环境
我在用着
- 视窗 10
- 适用于 Windows 的 Docker 桌面 3
- 使用带有环境变量的容器
PHP_IDE_CONFIG=serverName=Docker
- 使用带有环境变量的容器
- XDebug 3
- PhpStorm 2021.1.2
- 在 Settings > PHP > Servers 中有一个名为“Docker”的条目
使用这些 XDebug 设置:
php -i | grep xdebug
xdebug.cli_color => 0
xdebug.client_discovery_header => no value
xdebug.client_host => host.docker.internal
xdebug.client_port => 9003
xdebug.cloud_id => no value
xdebug.collect_assignments => Off
xdebug.collect_return => Off
xdebug.connect_timeout_ms => 200
xdebug.discover_client_host => Off
xdebug.dump.COOKIE => no value
xdebug.dump.ENV => no value
xdebug.dump.FILES => no value
xdebug.dump.GET => no value
xdebug.dump.POST => no value
xdebug.dump.REQUEST => no value
xdebug.dump.SERVER => no value
xdebug.dump.SESSION => no value
xdebug.dump_globals => On
xdebug.dump_once => On
xdebug.dump_undefined => Off
xdebug.file_link_format => no value
xdebug.filename_format => no value
xdebug.force_display_errors => Off
xdebug.force_error_reporting => 0
xdebug.gc_stats_output_name => gcstats.%p
xdebug.halt_level => 0
xdebug.idekey => no value
xdebug.log => /var/log/foo/xdebug.log
xdebug.log_level => 7
xdebug.max_nesting_level => 256
xdebug.max_stack_frames => -1
xdebug.mode => develop,coverage,debug,gcstats,profile,trace
xdebug.output_dir => /var/log/foo
xdebug.profiler_append => Off
xdebug.profiler_output_name => cachegrind.out.%p
xdebug.scream => Off
xdebug.show_error_trace => Off
xdebug.show_exception_trace => Off
xdebug.show_local_vars => Off
xdebug.start_upon_error => default
xdebug.start_with_request => yes
xdebug.trace_format => 0
xdebug.trace_options => 0
xdebug.trace_output_name => trace.%c
xdebug.trigger_value => no value
xdebug.var_display_max_children => 128
xdebug.var_display_max_data => 512
xdebug.var_display_max_depth => 3
还有一些后台进程自动发生,可能会被 XDebug 处理,从而创建到 PhpStorm 的连接数超过其“最大同时连接数”值,但即使将其设置为最高值(20 ) 而不会出现在调试面板中创建多个选项卡。
问题
XDebug 适用于浏览器请求和 CLI 脚本,我可以成功启动单步调试,但几分钟后,当XDebug尝试发送“停止" 响应,随后的请求/脚本无限期挂起。XDebug 日志显示:
[95] [Step Debug] -> <response xmlns="urn:debugger_protocol_v1" xmlns:xdebug="https://xdebug.org/dbgp/xdebug" status="stopping" reason="ok"></response>
[95] [Step Debug] WARN: 2021-05-26 20:55:26.677006: There was a problem sending 179 bytes on socket 5: Broken pipe.
[95] Log closed at 2021-05-26 20:55:26.677314
故障排除
当执行挂起时,PhpStorm 的调试面板没有显示任何活动
- 在 IDE 中关闭“Listening for PHP Debug Connections”会导致脚本立即恢复执行,但将其重新打开会导致下一个请求也无限期挂起
- 重新启动 PhpStorm 不仅可以恢复请求/脚本的执行,还可以恢复单步调试。但几分钟后,单步调试再次不可用,请求无限期挂起。
调查
- 此评论表明这是因为 IDE 在 XDebug 可以发送“停止”响应之前关闭连接。
- Windows Docker Desktop中似乎存在一个当前未解决的错误,它使 Docker 在一段时间不活动后丢弃空闲的 TCP 连接,导致 XDebug 会话结束,即使脚本继续运行也是如此。
问题
- PhpStorm是否负责关闭连接,是否可以配置为不负责?
- Docker是否负责关闭连接,是否有解决方法?
- 会不会完全是别的东西?