xdebug.start_start_with_request=yes 如果调试客户端没有监听,则没有错误

Posted

技术标签:

【中文标题】xdebug.start_start_with_request=yes 如果调试客户端没有监听,则没有错误【英文标题】:xdebug.start_start_with_request=yes WITHOUT error if the debug client is not listening 【发布时间】:2021-04-13 09:43:38 【问题描述】:

我曾经使用 Xdebug 2 进行以下配置:

xdebug.default_enable=1

当没有调试客户端正在监听时,Xdebug 不会减慢执行速度,但是当我需要调试某些东西时,我只需要在 phpStorm 中启用监听并刷新页面。 不需要浏览器扩展。同样适用于调试 CLI 应用程序,它只是工作。

我尝试通过以下配置在 Xdebug 3 中实现同样的效果:

xdebug.mode=debug
xdebug.start_start_with_request=yes

每次我在 PhpStorm 中禁用调试侦听并运行 CLI 命令时,它的工作原理都是一样的,但我收到以下消息,error 严重性:

Xdebug: [Step Debug] Could not connect to debugging client. Tried: 172.17.0.1:9003 (through xdebug.client_host/xdebug.client_port) :-(

这是我可以接受的东西,但它也使 PHPUnit 测试失败 beStrictAboutOutputDuringTests="true" 已启用。

如果我使用xdebug.default_enable=1,升级guide 建议使用xdebug.module=develop,但这不是有效的替代品。

完全静默所有 Xdebug 日志,甚至禁用this 评论建议的 PHP 错误报告,在我看来是一种肮脏的 hack,可能存在缺陷,而不是有效的解决方案。

如果没有此消息,我如何保持预期的行为?

【问题讨论】:

1) 是的,您需要 xdebug.mode=debug 进行调试(如果需要,您也可以组合多个值,例如 xdebug.mode=debug,develop 但目前 PhpStorm 不明白,如果您使用他们的可选验证工具)。 2) “如果没有此消息,我怎样才能保持预期的行为?” 您的 error_log 配置值是多少?听起来好像是空的。如果您将其指向有效文件(例如/var/log/php_error.log),那么此类错误消息将被发送到那里(Xdebug 使用标准 PHP 错误记录;PHP(是的,PHP)将其打印在您的 std 输出中,因为该值未配置,并且让你有机会看到它)。 如果正确配置 PHP 的错误日志对您来说是一个“肮脏的黑客”,或者您出于某种原因根本不想配置它......那么不要使用 xdebug.start_start_with_request=yes 并告诉 Xdebug 它需要在需要时以其他方式调试此脚本(例如,在运行该脚本时将此类参数传递给 PHP 可执行文件,在您的 PHP 代码中有 xdebug_break();,设置 Xdebug ENV 变量等 - 检查 Xdebug 文档) 感谢您的想法,我通常使用 wodby/php 进行开发,这是默认配置:github.com/wodby/php/blob/4.18.6/7/templates/… 目前,无法通过此图像中的 env vars 覆盖 error_log 配置,所以我打开了一个问题:github.com/wodby/php/issues/134 请考虑将您的解决方案作为答案(您可以接受自己的答案)——为什么选择该选项,为什么其他选项对您不可接受/不可用(无法控制它们等) .有一些细节总是有帮助的。这将帮助许多其他处于类似情况的用户,并且有答案将使其更加可见/有用。谢谢。 【参考方案1】:

Xdebug 3 现在在收到指令时会发出警告(通过xdebug.start_with_request=1 或使用 COOKIE 或 GET 参数)并且它无法连接到您的 IDE。以前很多人在让 Xdebug 工作时遇到问题,而这个警告对于他们指出出现问题非常有用。

不显示错误消息的正确方法是根本不指示 Xdebug 连接到您的 IDE。

我建议使用 xdebug.start_with_request=trigger,然后使用浏览器扩展作为触发器 (https://xdebug.org/docs/step_debug#browser-extensions),或者在命令行上导出 export XDEBUG_SESSION=yourname

设置xdebug.log_level=0 意味着您隐藏所有警告和错误,这使得无法调试任何东西。不要那样做。

【讨论】:

嗨 Derik,你能检查我上面的答案吗?谢谢***.com/a/65725090/3822351(评论太长了) 嗨德里克。我已经设置了xdebug.start_with_request=trigger,但我的 CLI 仍然每次都尝试连接,并且每次都会收到此警告。我什至配置了xdebug.trigger_value=PHPIDExdebug_info() 中的一切看起来都很棒,但我仍然收到警告。是否按预期工作?【参考方案2】:

感谢您分享您对此 Derick 的看法。

设置 xdebug.log_level=0 意味着您隐藏所有警告和错误,这使得无法调试任何东西。不要那样做。

我根本不想这样做,但目前我没有看到另一种方法来保持我在问题描述中解释的旧行为。

以前很多人在让 Xdebug 工作时遇到问题,而这个警告对他们指出出现问题非常有用。

我完全理解这种新行为背后的动机,而且我也看到它可能对许多人有用。虽然,无法抑制此警告这一事实可能会给那些知道自己在做什么的人带来问题。

嗯,“他们在做什么”可能是一个不恰当的短语,他们想要的可能更好......

我们公司有一个使用 xDebug 2 的工作流程,不需要任何额外的浏览器扩展或环境变量(见上文),只需在 IDE 中启用监听 xDebug 连接并使用魔法......记录的解决方案和我们基于 Docker 的开发人员堆栈确保 xDebug 为每个开发人员工作 OOTB。 (同样,没有任何额外的依赖)

您是否建议 xDebug 3 不再支持此工作流程?

是否有机会向 xDebug 3 添加新配置,允许仅禁止显示这些新警告并启用“专家模式”?

【讨论】:

您是否找到了更好的解决方法,可能是他们添加的新环境变量PHP_XDEBUG_LOGPHP_XDEBUG_LOG_LEVEL?因为xdebug.log_level=0 在使用 cli (phpunit) 运行时不显示错误,但是在测试完成后该过程没有完成。测试可能会在 120 毫秒内完成并显示结果,但该过程仍在执行中(我的 ide 认为它仍在测试这很烦人)超过 10 秒。注意:启用 log_level 时,它会显示您在问题中引用的错误,例如每秒 10 次。

以上是关于xdebug.start_start_with_request=yes 如果调试客户端没有监听,则没有错误的主要内容,如果未能解决你的问题,请参考以下文章