【问题标题】:Check if xdebug is working检查 xdebug 是否正常工作
【发布时间】:2012-12-12 08:39:23
【问题描述】:

在不安装文本编辑器或IDE的情况下,是否可以测试xdebug是否正常工作,即是否可以调试php代码?

在 phpinfo() 中出现的唯一部分 xdebug 如下:

额外的.ini文件解析/etc/php5/apache2/conf.d/mysql.ini, /etc/php5/apache2/conf.d/mysqli.ini, /etc/php5/apache2/conf.d/pdo.ini, /etc/php5/apache2/conf.d/pdo_mysql.ini, /etc/php5/apache2/conf.d/xdebug.ini

其他地方的 phpinfo() 中没有提到。

【问题讨论】:

  • phpinfo() 是否将其报告为已加载的扩展程序?这就是你所说的“工作”吗?
  • 如果它显示在您的 phpinfo() 上,您可以尝试在 Xdebugs 端口(默认为 9000)上远程登录
  • @Wiseguy,我已经更新了这个问题。这是否意味着它已加载/正常工作?
  • @tix3,我已经更新了这个问题。这是否意味着它已加载/正常工作?
  • 如果实际加载了扩展,它应该有自己的部分来列出其配置指令。

标签: php xdebug


【解决方案1】:

如果不实际进行一些调试,我猜你无法确定调试器正在工作。

但是你可以很确定——我想人们应该假设如果 xDebug 的某些方面正常工作,那么它就会全部正常工作。

鉴于此,您可以通过尝试以下操作来确认 xDebug 已安装并到位:

1) phpinfo() -- 这将显示所有已加载的扩展,包括 xDebug。如果它在那里,那么可以肯定它正在工作。

2) 如果这对您来说还不够好,您可以尝试使用var_dump() 函数。 xDebug 修改var_dump() 的输出以包含附加信息。如果这已经到位,那么 xDebug 正在工作。

3) xDebug 修改 PHP 的错误输出。如果您的程序在使用 xDebug 时崩溃,您将获得比标准 PHP 崩溃输出更多的失败信息。

4) xDebug 还为 PHP 添加了许多辅助函数。您可以尝试其中的任何一个,看看它是否有效。例如,函数xdebug_get_code_coverage() 应该存在并返回一个数组。如果是,则安装 xDebug。如果不是,那就不是。

【讨论】:

  • phpinfo() 仅在Additional .ini files parsed 中提及 xdebug。现在检查您的其他建议。
  • 刚试过xdebug_get_code_coverage(),我得到Fatal error: Call to undefined function xdebug_get_code_coverage() in /var/www/xdebug.php on line 5
  • 很公平。这相当确凿地告诉你 xdebug 没有正确安装。
  • 仅供参考,如果是这种情况,那么您应该打开您的/etc/php/conf.d/xdebug.ini 文件,这是在解析的其他 .ini 文件中提到的文件,并取消注释其中的所有行。 zend_extension=xdebug.so xdebug.remote_enable=on xdebug.remote_host=127.0.0.1 xdebug.remote_port=9000 xdebug.remote_handler=dbgp
  • @TonyMorello 我认为这对我有帮助,因为我的 php.ini 使用完整路径正确设置,但在 Debian 中还有一个 /mods-available 目录并且 xdebug.ini 设置存在冲突(我认为)我的 php.ini 设置。
【解决方案2】:

运行

php -m -c

在您的终端中,然后查找[Zend Modules]。如果已加载,它应该在某处!

注意

如果您使用的是 Ubuntu,它可能不会显示在此处,因为您需要将 /etc/php5/apache2/php.ini 中的 xdebug 设置添加到 /etc/php5/cli/php.ini

我的 Xdebug 设置:

对于 Xdebug 3 (及以上)

[xdebug]
zend_extension = /usr/lib/php5/20121212/xdebug.so
xdebug.mode=debug
xdebug.client_host=localhost
;# The default is 9003
xdebug.client_port=9000

对于 Xdebug 2.9 (或以下)

[xdebug]
zend_extension = /usr/lib/php5/20121212/xdebug.so
xdebug.remote_enable=on
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=localhost
xdebug.remote_port=9000

【讨论】:

  • php --version 如果加载了 Xdebug 也会列出
  • @mfink php --version 对我不起作用。刚启动我的机器,在 Apache 启动并工作后,php --version 显示 Xdebug,但 phpinfo() 不显示 xdebug 部分。并且 PHP 脚本执行不会在断点处停止。在我运行service apache2 restart 之后,phpinfo() 显示 xdebug 部分并且调试工作正常。因此,由于某种原因,在机器启动期间启动 Apache 时没有加载 xdebug。所以现在我必须在每次启动后重新启动 Apache。
【解决方案3】:

在您的问题中,您提到您的 phpinfo 声明 apache 正在 /etc/php5/apache2/conf.d/xdebug.ini 中加载 xdebug 的配置 在许多在线说明中,您可能会注意到他们要求您将 xdebug 配置放入 php.ini(这就是我所做的)但是,如果配置设置为 /etc/php5/apache2/conf.d/xdebug。 ini,那么您应该从 /etc/php5/apache2/php.ini 中删除 [XDebug] 配置设置并将其放入 /etc/php5/apache2/conf.d/xdebug.ini INSTEAD。一旦我从 /etc/php5/apache2/php.ini 中删除并改为放入 /etc/php5/apache2/conf.d/xdebug.ini 并重新启动 apache,它就可以工作了!!

因此,在您的 /etc/php5/apache2/conf.d/xdebug.ini 中,输入以下内容:

[XDebug]
zend_extension="/usr/lib/php5/20121212+lfs/xdebug.so"
xdebug.remote_enable=1
xdebug.remote_port="9000"
xdebug.profiler_enable=1
xdebug.profiler_output_dir="/home/paul/tmp"

xdebug.remote_host="localhost"
xdebug.remote_handler="dbgp";
xdebug.idekey="phpstorm_xdebug"

然后从 /etc/php5/apache2/php.ini 中删除它,如果你也把它放在那里的话。

然后做:

sudo service apache2 重启

那么它应该可以工作了!!!

【讨论】:

    【解决方案4】:

    经过近 24 小时的苦苦运行,试图让 xdebug 与 Netbeans 8.0.2 一起工作,我找到了一个解决方案,我希望它适用于所有 Ubuntu 和 Ubuntu 相关堆栈。

    问题一:PHP 和 xdebug 版本必须兼容

    有时,如果您正在运行 Linux 设置并 apt-get 安装 xdebug,它不会为您提供正确的 xdebug 版本。就我而言,我有最新的 php 版本,但有一个旧的 xdebug 版本。那一定是由于我当前的 Xubuntu 版本。软件版本取决于存储库,而存储库又取决于您运行的操作系统版本。

    解决方案:PHP 有一个简洁的扩展管理器,称为 PECL。按照here 的说明启动并运行它。 首先,正如 cmets 的一位成员所指出的,您应该安装 PHP 的开发人员包才能使 PECL 工作:

    sudo apt-get install php5-dev
    

    然后,使用 PECL,您将能够安装最新的稳定版本的 xdebug:

    sudo pecl install php5-xdebug
    

    完成后,将安装正确版本的 xdebug,但尚未准备好使用。之后,您需要启用它。我已经看到很多关于如何做到这一点的建议,但事实是 PHP 需要为客户端和服务器启用一些模块,在本例中为 Apache。似乎这里的最佳实践是使用启用模块的内置方法,称为 php5enmod。用法描述here

    问题二:正确启用模块

    首先,您需要进入 /etc/php5 文件夹。在那里,您会找到 3 个文件夹,apache2、cli 和 mods_available。 mods_available 文件夹包含带有激活给定模块的说明的文本文件。命名约定是 [module].ini。看看其中的几个,看看它们是如何设置的。

    现在您必须在 mods_available 文件夹中创建您的 ini 文件。创建一个名为 xdebug.ini 的文件,并在该文件中粘贴以下内容:

    [xdebug]
    zend_extension = /usr/lib/php5/20121212/xdebug.so
    xdebug.remote_enable=on
    xdebug.remote_handler=dbgp
    xdebug.remote_mode=req
    xdebug.remote_host=localhost
    xdebug.remote_port=9000
    

    确保指令 [xdebug] 存在,与上面的示例完全相同。模块必须工作。事实上,只需复制并粘贴整个代码,这样你就会成为一个更快乐的人。 :D

    注意:zend_extension 路径非常重要。在本例中,它指向 PHP 引擎的当前版本,但您应该首先转到 /usr/lib/php5 并确保以数字命名的文件夹是正确的。将名称调整为您在那里看到的任何名称,当您使用它时,检查文件夹内部以确保 xdebug.so 确实存在。它应该是,如果你做的一切正确。

    现在,随着您的 xdebug.ini 创建,是时候启用该模块了。为此,请打开控制台并输入:

    php5enmod xdebug
    

    如果一切顺利,PHP 会创建两个指向该文件的链接,一个在 /etc/php5/apache2/conf.d 内,另一个在 /etc/php5/cli/conf.d 内

    重新启动您的 Apache 服务器并在控制台上输入:

    php -v
    

    你应该得到这样的东西:

    PHP 5.5.9-1ubuntu4.6 (cli) (built: Feb 13 2015 19:17:11) 
    Copyright (c) 1997-2014 The PHP Group
    Zend Engine v2.5.0, Copyright (c) 1998-2014 Zend Technologies
    with Zend OPcache v7.0.3, Copyright (c) 1999-2014, by Zend Technologies
    with Xdebug v2.3.1, Copyright (c) 2002-2015, by Derick Rethans
    

    这意味着 PHP 客户端确实读取了您的 xdebug.ini 文件并加载了 xdebug.so 模块。到目前为止一切顺利。

    现在在您的 Web 服务器的某处创建一个 phpinfo 脚本,然后运行它。如果一切正常,这就是你应该看到的:

    如果你看到这个,Apache 也加载了这个模块,你可能已经准备好了。现在让我们看看 Netbeans 是否能正确调试。创建一个非常简单的脚本,添加一些变量,给它们赋值,并在它们上设置一个断点。现在点击 CTRL+F5,点击调试器面板上的“step in”,看看你是否得到这样的结果:

    记得在 tools/options/php 下检查 Netbeans 配置以进行调试。它应该看起来像这样:

    我希望这能对这个相当模糊、令人困惑的问题有所了解。

    祝你好运!

    【讨论】:

    • 为我工作,这个答案可能应该在 xdebug 或 netbeans 网站上
    • 我必须安装 PHP 的开发包才能让 PECL 工作:sudo apt-get install php5-dev.
    • 另外,php5enmod 不会在 ini 文件中创建任何链接,没有它也可以很好地工作。
    • 还有一件事:ini 文件中的[xdebug] 指令对于使其正常工作至关重要。我很困惑,在原始 ini 文件中,[xdebug] 丢失了,但对我来说,没有它就无法工作。
    • 您好!您对安装 PHP 的开发人员包是正确的,我将相应地更新帖子。不确定您对 php5enmod 的评论。它在我指定的文件夹上创建链接。是的,[xdebug] 指令是必不可少的,我也会更新帖子以反映这一点。感谢您的反馈!
    【解决方案5】:

    如果您使用的是 Eclipse,那么请注意,在 XDebug 模式下运行时,魔术常量 __FILE__ 将始终被计算为:

    xdebug://debug-eval
    

    因此,如果您的会话在 XDebug 下,则以下检查将返回 true

    $is_xdebug = false !== strpos(__FILE__,'xdebug'); // true while on XDebug
    

    【讨论】:

      【解决方案6】:

      尝试如下,将返回xDebug does exists.xDebug doesn't exists.

      <?=sprintf('xDebug does%s exists.', extension_loaded('xdebug') ? '' : "n't");
      

      在 CLI 上:

      php -r "printf('xDebug does%s exists.' . PHP_EOL, 
      extension_loaded('xdebug') ? '' : 'n\'t');"
      

      【讨论】:

        【解决方案7】:

        你可以运行这个小php代码

        <?php
        phpinfo();
        ?>
        

        复制整个输出页面, 将其粘贴到此link 中。然后分析。它将显示是否安装了 Xdebug。它会给出完成安装的说明。

        【讨论】:

          【解决方案8】:

          只是为了扩展KsaRs 的答案并提供从命令行检查 xdebug 的可能性:

          php -r "echo (extension_loaded('xdebug') ? '' : 'non '), 'exists';"
          

          【讨论】:

            【解决方案9】:

            从 xdebug 3 开始,您可以使用以下命令行:

            php -r "xdebug_info();"
            

            它会显示有关您的 xdebug 安装的有用信息。

            【讨论】:

              【解决方案10】:

              注意xDebug 3 的配置选项have changed。 PhpStorm 手册:Configure xDebug 也很好地解释了它(它带有一个验证器脚本,正在上传)。 搞砸了一个无法配置的PECL版本后,答案是:

              su
              dnf remove php-xdebug
              dnf install php-devel
              
              cd /usr/src
              wget https://xdebug.org/files/xdebug-3.0.4.tgz
              tar -xvzf xdebug-3.0.4.tgz
              cd xdebug-3.0.4/
              phpize
              ./configure --enable-xdebug
              make
              make install
              

              xDebug 3 可以使用这样的配置(注意 [xdebug] 部分):

              ; Enable xdebug extension module
              zend_extension=xdebug.so
              
              [xdebug]
              xdebug.mode=debug
              xdebug.client_host=localhost
              xdebug.client_port=9003
              

              这两个文件中的内容:

              nano /etc/php-cli.d/xdebug.ini
              nano /etc/php.d/xdebug.ini 
              

              然后可以允许网络连接并重新加载 INI:

              setsebool -P httpd_can_network_connect 1
              systemctl restart php-fpm.service
              

              最后:

              php -r "xdebug_info();"
              

              【讨论】:

                【解决方案11】:

                您可以在终端中使用 php -v 命令检查是否安装了 xdebug

                【讨论】:

                  【解决方案12】:

                  我意识到这个问题有点老了,但是 xdebug 3 出来了,很多事情都发生了变化。

                  php.exe -r "xdebug_info();"
                  

                  仍然可以,但是php.ini中的配置不同:

                  对于xampp 安装(php 8.0.12)我有:

                  [xdebug]
                  zend_extension="C:\xampp\php\zend_ext\php_xdebug-3.1.1-8.0-vs16-x86_64.dll"
                  xdebug.output_dir="c:/xampp/xdebug"
                  xdebug.mode=debug
                  xdebug.log=c:/xampp/xdebug/xdebug.log
                  xdebug.log_level=7
                  xdebug.profiler_output_name=%p.%t.cgrind
                  

                  这也会写一个xdebug.log文件,内容如下:

                  [8028] Log opened at 2021-10-28 09:42:33.878279
                  [8028] [Config] INFO: Trigger value for 'XDEBUG_TRIGGER' not found, falling back to 'XDEBUG_SESSION'
                  [8028] [Config] INFO: No shared secret: Activating
                  [8028] [Step Debug] INFO: Connecting to configured address/port: localhost:9003.
                  [8028] [Step Debug] ERR: Time-out connecting to debugging client, waited: 200 ms. Tried: localhost:9003 (through xdebug.client_host/xdebug.client_port) :-(
                  [8028] Log closed at 2021-10-28 09:42:34.298475
                  

                  对于wampserver,xdebug 已包含在内并且开箱即用。这使它更容易使用。

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 2013-08-10
                    • 2015-08-05
                    • 2015-07-25
                    • 1970-01-01
                    • 1970-01-01
                    • 2015-10-13
                    • 2014-01-11
                    • 2020-04-23
                    相关资源
                    最近更新 更多