【问题标题】:How to fix curl_exec call hanging when Xdebug is enabled启用 Xdebug 时如何修复 curl_exec 调用挂起
【发布时间】:2019-05-16 02:48:04
【问题描述】:

我有一个本地 ddev(基于 docker)PHP Drupal 7 开发环境设置。我已经使用 Behat Drupal Extension 为本网站设置了 Behat 测试。

所有 Behat 上下文文件和相关的 Composer 供应商文件夹都位于站点 Web 根目录之外的测试文件夹中。文件夹结构类似于:

  • 项目

    • 测试

    • public_html

我已启用 xdebug 并使用 PhpStorm。我已经设置了一个 PhpStorm 调试服务器并提供了正确的路径映射。

通过浏览器调试 php 代码效果很好,调试 CLI 命令效果很好。当我在通过 CLI 运行 Behat 测试时尝试调试所有代码时,就会出现我的问题。

在 PhpStorm PHP 服务器配置中,如果我只为 testing 文件夹设置路径映射,我可以调试测试文件夹中的任何代码,并且不会出现 curl 问题。我显然无法调试public_html 文件夹中的代码,因为我没有设置路径映射。当我为testingpublic_html 文件夹设置路径映射时,我可以调试所有代码,但任何包含对站点本地URL 的Mink curl_exec() 调用的行为步骤定义都会挂起3 到10分钟!

我的目标...

能够在运行 Behat 测试时调试 testingpublic_html 文件夹中的所有 php 代码,而不会挂起 curl_exec()

我尝试过的...

我将 PhpStorm Debug Max Simultaneous Connections 设置为 10,并尝试了 20。

这是我的 xdebug 远程配置设置:

xdebug.remote_addr_header => no value => no value
xdebug.remote_autostart => On => On
xdebug.remote_connect_back => Off => Off
xdebug.remote_cookie_expire_time => 3600 => 3600
xdebug.remote_enable => On => On
xdebug.remote_handler => dbgp => dbgp
xdebug.remote_host => host.docker.internal => host.docker.internal
xdebug.remote_log => no value => no value
xdebug.remote_mode => req => req
xdebug.remote_port => 9000 => 9000

以下所有都导致 curl 挂起:

  • 设置 xdebug.remote_autostart=0 并通过使用我的 behat 命令传入 XDEBUG_CONFIG=idekey=PHPSTORM 环境变量来启动 Xdebug 会话
    • 不通过 curl 调用传递任何 cookie 或 GET 参数。
    • 通过 curl 调用传递相同的 idekey 作为 cookie 和 GET 参数
    • 通过 curl 调用将不同的 idekey 作为 cookie 和 GET 参数传递

非常感谢任何帮助!

【问题讨论】:

  • 收集 Xdebug 日志,它可能会说明发生了什么(如果它尝试连接以及在哪里连接)。 xdebug.remote_log
  • 只有当您尝试从同一个应用程序访问 URL 时才会发生这种情况?
  • 感谢@LazyOne 和 NicoHaase 的建议。是的,仅当来自同一应用程序的 URL 时才会出现此问题。我收集了 Xdebug 日志,他们发现正在建立连接并卡在运行命令上。这让我认为是 PhpStorm 特定的东西或网站没有响应导致了问题。我在下面的答案中有更多详细信息。再次感谢!

标签: php docker phpstorm xdebug ddev


【解决方案1】:

在遵循@LazyOne 的建议后,我更仔细地查看了 Xdebug 日志,并注意到在成功建立 xDebug 连接后发生了挂起。这导致我有两个可能的原因;一些没有在 PhpStorm 调试工具窗口中注册的 rouge 断点或网站上的某些东西延迟了响应。

所以我做了以下事情:

  1. 删除了应用程序中的所有 PhpStorm Debug 断点并重新启动了 PhpStorm。
  2. 实现了 Drupal 7 配置中的自动 Cron 设置被设置为每隔 1 Day 运行一次,因此将其切换为 Never。我的想法可能是 Drupal Cron 的执行被卡住并且没有完成,因此每个 HTTP 请求都挂起。

它工作了,现在我希望我已经分别测试了这些步骤,因为我不知道究竟哪一个是解决方案。我倾向于#1,因为当我在 PhpStorm 中关闭调试时,Behat 测试将立即执行。无论哪种方式,如果您有类似的问题,请尝试以上两种方法。

【讨论】:

    猜你喜欢
    • 2013-07-19
    • 2015-10-25
    • 2011-09-12
    • 2011-10-09
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-12
    相关资源
    最近更新 更多