检查 xdebug 是不是正常工作
Posted
技术标签:
【中文标题】检查 xdebug 是不是正常工作【英文标题】: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,我已经更新了这个问题。这是否意味着它已加载/正常工作?
如果实际加载了扩展,它应该有自己的部分来列出其配置指令。
【参考方案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 已包含在内并且开箱即用。这使它更容易使用。
【讨论】:
以上是关于检查 xdebug 是不是正常工作的主要内容,如果未能解决你的问题,请参考以下文章