【问题标题】:IntelliJ, PhpStorm: Debugging with xdebug ignores XDEBUG_SESSION cookieIntelliJ,PhpStorm:使用 xdebug 进行调试会忽略 XDEBUG_SESSION cookie
【发布时间】:2016-10-29 20:40:31
【问题描述】:

我正在尝试使用 Intellij 中的 PHP 插件调试 Drupal 网站(在 PhpStorm 中也是如此)。

我有以下设置:

Chrome 浏览器指向 localhost 别名 mydomain.local,XDebug Helper 扩展已安装并设置为调试。在 Cookies 下的 Developer Tools 中,我可以看到 XDEBUG_SESSION cookie 设置为 PHPSTORM。

我已经使用以下设置配置了带有 xdebug 插件的 php:

xdebug.extended_info = 1
xdebug.idekey = "PHPSTORM"
xdebug.max_nesting_level = 500
xdebug.remote_autostart = 1
xdebug.remote_connect_back = 0
xdebug.remote_enable = 1
xdebug.remote_handler = dbgp
xdebug.remote_host = 127.0.0.1
xdebug.remote_mode = req
xdebug.remote_port = 9000

在 IntelliJ 中,我设置了一个指向 mydomain.local 的服务器,在运行配置中,我正在使用该服务器并将 Ide Key 设置为 PHPSTORM

现在问题是这样的:

如果我启用Break at first line in PHP scripts,那么调试器会立即在index.php 内的第一个可破坏位置处中断。如果我禁用该选项,我会收到未命中断点的警告,即使我设置了断点并且我确信代码正在执行。我看到的警告如下所示:

Debug session was finished without being paused
It may be caused by path mappings misconfiguration or not synchronized
local and remote projects.
To figure out the problem check path mappings configuration for 
'mydomain.local' server at PHP|Servers or enable Break at first line in
PHP scripts option (from Run menu).

现在,如果我明确使用附加了以下查询参数的 URL:?XDEBUG_SESSION_START=PHPSTORM,那么我的所有断点都会在 IntelliJ 中正确中断。

问题:为什么XDEBUG_SESSION cookie 会被忽略?

更新:php -v添加了我的PHP和XDebug版本输出:

PHP 7.0.8-0ubuntu0.16.04.3 (cli) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
    with Zend OPcache v7.0.8-0ubuntu0.16.04.3, Copyright (c) 1999-2016,
    by Zend Technologies
    with Xdebug v2.4.0, Copyright (c) 2002-2016, by Derick Rethans

和我的 Apache 虚拟主机配置:

<VirtualHost *:80>
    DocumentRoot /var/www/html/mydomain
    ServerName mydomain.local
    <Directory /var/www/html/mydomain>
        Options Indexes FollowSymLinks
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/mydomain.log
</VirtualHost>

更新 2: 我安装了一个名为fpm 的php 扩展。我不太确定为什么要安装它或是否需要它。我认为它是用 php 自动安装的。这会不会有干扰?

【问题讨论】:

  • 您是否尝试将remote_autostart 设置为0?如果您想通过设置 cookie 来启用调试,似乎没有必要将此选项设置为 1。
  • 另外,你的 xdebug 版本是多少?
  • 检查你的网站是否做了一些重定向,这可能是它没有在你期望的地方中断的原因。虽然听起来好像不是这样,因为它在您添加 GET 参数时起作用。
  • remote_autostart 设置为 0 没有帮助。我已经更新了我的问题以包括 php 和 xdebug 版本以及 apache 配置。我知道没有发生重定向。我刚刚注意到的另一件事是,当我在浏览器中一次刷新页面时,消息 Debug session was done without being paused 出现了 3 次。
  • 1) 除了调试真正的 Drupal 代码——你能不能用很少的单行指令创建一个简单的 .php 文件并尝试调试那个文件——可以吗?工作?例如(每行只制作一个):&lt;?php $a = 1; $b = 2; $c = $a + $b; echo $c; 2) 据我了解,调试实际上可以工作..但它需要 GET 参数或自动调试..因为单独使用 COOKIE 是不行的工作——对吧?如果是这样——它必须是 xdebug 问题(因为它是启动调试连接的 xdebug)或浏览器/Web 服务器配置问题(例如 cookie 被剥离/更改)——你能在 $_COOKIE 中看到它吗?

标签: php intellij-idea phpstorm xdebug


【解决方案1】:

当我“过度配置”我的设置时,我曾经遇到过这个问题。

  1. 您可能想尝试将 XDebug helper extension 添加到 chrome
  2. 添加后进入插件设置并选择 PhpStorm:

  1. 尝试将您的 xdebug 配置仅剥离为这些值:

(在我的盒子上工作)

zend_extension=xdebug.so
xdebug.remote_enable=1
xdebug.remote_port=9000
  1. PhpStorm 配置应包含调试端口 9000 和 [X] 可以接受外部连接:

  1. 那么您应该在 PhpStorm 中监听调试连接:

  1. 还可以在浏览器中启用调试(通过 xdebug 帮助程序):

  1. 如果错误图标为绿色,那么如果您刷新页面,您应该可以继续,PhpStorm 应该会在第一个断点处停止。

【讨论】:

    【解决方案2】:

    在虚拟机中调试代码时,我在 PHPStorm 9 中遇到了同样的问题。但首先你要问:

    问题:为什么 XDEBUG_SESSION cookie 会被忽略?

    回答:我不确切知道,但我怀疑当您明确指定?XDEBUG_SESSION_START=PHPSTORM 或“第一行中断”时它会起作用,它忽略了传入的请求。它会完成它的工作,但不会在断点处停止,因为它认为当前请求不需要它。

    我的解决方案

    在调试浏览器调用时,帮助我将远程主机名/IP 添加到 xdebug 中。或者export从命令行调试时的那些设置。

    对于 xdebug.ini

    xdebug.remote_host=mydomain.local;
    xdebug.remote_connect_back = On
    

    命令行使用:

    export PHP_IDE_CONFIG=serverName=mydomain.local; php -dxdebug.remote_autostart=1 -dxdebug.remote_connect_back=1 -dxdebug.remote_host=mydomain.local ./script.php
    

    然后设置 path mapping 。为此,请转到 Settings -> Languages &amp; Frameworks -> PHP -> Server。 在那里选择您设置的服务器,例如mydomain.local 如果存在并输入mydomain.local 作为主机名,端口为80XDEBUG。 现在检查“使用路径映射”并向下滚动到您的 index.php 或您可以从浏览器访问的其他一些唯一入口点。 下一个听起来很愚蠢,但对我有用。如果您的index.php 位于/home/lanoxx/project/index.php 下,请在“服务器上的绝对路径”下输入相同 位置。然后在index.php 文件中设置断点并从浏览器加载页面。

    【讨论】:

      【解决方案3】:

      如果你使用 fpm 和 nginx,也许你指定 fastcgi_pass FastCGI-server 默认在端口 9000 上工作。如果是,请为 Xdebug 设置另一个空闲端口,例如 9009

      【讨论】:

        【解决方案4】:

        事实证明,问题不在于 IntelliJ 或 PhpStorm,而在于 Drupal 特定。特别是我需要禁用所有缓存。

        文章Disable Drupal 8 caching during development 详细解释了执行此操作的步骤。

        在我禁用缓存 Drupal 后,一切都按预期工作。

        【讨论】:

          【解决方案5】:

          尝试这些配置,看看是否有帮助

          zend_extension=/usr/lib/php/extensions/no-debug-non-zts-20121212/xdebug.so
          xdebug.remote_autostart = 1 <-------- THIS
          xdebug.remote_enable = 1 <----------- AND THIS
          

          【讨论】: