【问题标题】:Xdebug set cookie XDEBUG_SESSION too many timesXdebug 设置 cookie XDEBUG_SESSION 太多次
【发布时间】:2013-09-16 15:28:31
【问题描述】:

我使用 PhpStorm、xdebug 和 nginx + php-fpm 进行远程调试。当我在请求 GET 参数中传递 XDEBUG_SESSION_START=my_ide_key 时,Nginx 以 502 错误代码(错误网关)响应。同时,我在 IDE 中的代码断点工作正常。当我不传递XDEBUG_SESSION_START 参数时,nginx 会以格式正确的 HTML 和代码 200 响应。但很明显,没有这个参数就没有调试。

在 nginx 错误日志中,我看到有关从上游收到的大标头的通知。我尝试转储 php-fpm 和 nginx 之间的通信,只有一个不同的事情是一个 Set-Cookie 标头:

Set-Cookie: XDEBUG_SESSION=666; expires=Mon, 16-Sep-2013 16:07:28 GMT; path=/

我尝试查找此标头何时出现在响应中。我发现在我的 smarty 插件 Smarty_Internal_Template 析构函数中(在我的启动脚本的最后一个代码行之后)如果我调用 headers_list() 我会看到越来越多的 Set-Cookie 标头(相等的析构函数调用和 Set-Cookie 标头数量) .我确信我的代码中没有明确的header('Set-Cookie: XDEBUG_SESSION=...') 调用。我尝试升级和降级 xdebug 版本,但仍然有相同的行为。将代码remove_header('Set-Cookie') 放在Smarty_Internal_Template 解决了我的问题,但那是丑陋的黑客!

对这种奇怪的情况有什么想法吗?

【问题讨论】:

  • 一些附加信息:看起来每个注册的关闭函数都会调用“Set-Cookie”标头(从我看到逐步执行关闭函数时开始)。就我而言,Smarty 根本没有被使用。似乎这只是一个 php-shutdown-function-in-general 的东西。
  • 另一个可能相关也可能不相关的奇怪现象:headers_list() 还向我展示了 XDEBUG_SESSION 的 两个 'Set-Cookie' 标头已由我的 php 的第 1 行设置代码。

标签: nginx xdebug php setcookie


【解决方案1】:

在这种情况下,我建议不要使用 XDEBUG_SESSION_START。对我来说,看起来 XDEBUG_SESSION_START 正在触发服务器端的一些代码执行来设置 cookie。这会干扰 smarty 模板代码。

根据我使用 PHPStorm 的所有经验,我发现打开 xdebug 的最佳方法是通过书签,您可以在此处生成:

https://www.jetbrains.com/phpstorm/marklets/

小书签在浏览器本身中设置 cookie。因此,服务器中不会​​执行任何代码来设置 XDEBUG_SESSION 和路径变量,这可以减少或消除对 smarty 代码的干扰。

另外,使用 PHPStorm 的一个技巧是确保 PHPStorm 已启动并运行,并且 PHPStorm 和 php-fpm 之间的网络连接正常工作(我想这是您与 nginx 结合使用的)。

如果 php-fpm 无法连接到 PHPStorm,根据我的经验,代码最终会在服务器上执行,但速度会很慢。

有几次我错误地将其视为性能问题并浪费了大量时间。

【讨论】:

  • 恐怕我无法验证甚至评估您的答案,因为我不再使用 PHP。所以,我想从赏金启动者@jdunk 那里收到任何 cmets。
  • @Devang,虽然我很欣赏你的努力,但这确实不能回答问题,即“为什么在关闭时添加这些额外的 'Set-Cookie' 标头?”虽然使用 cookie 而不是 GET 参数确实会导致不会生成这些额外的标头,但这需要使用 cookie,而 cookie 用于持久性。使用 GET 参数是说“仅此请求”的唯一方法,因此,例如,当浏览器触发其他几个也由 php 处理的请求时,不会在第一个请求之后陷入调试器循环.
  • 我发布赏金的目的是为了深入了解 xdebug 和/或为什么设置这些标头。我有自己的解决方法,@Ostrovski 在他的问题中提供了一种解决方法。赏金是为了得到一个有点令人满意的答案:那些 xdebug 标头的机制。
  • 我明白了。我想我不会知道的。像@Ostrovski 一样,这些天我在 php 中不太活跃,我们正在转向 python。在 php 中进行调试工作将花费太多时间。我的建议是直接联系 jetbrains 并将这个问题提交给他们。我相信他们的一位开发者会喜欢这个赏金。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-12
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多