检查xdebug是否正常工作

106

没有安装文本编辑器或IDE,有没有可能测试xdebug是否正常工作,即它是否可以调试PHP代码?

xdebug在phpinfo()中出现的唯一部分是以下内容:

  

其他.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()中没有任何其他提及。


8
phpinfo()会报告它作为一个已加载的扩展吗?这就是你所说的“工作”吗? - Wiseguy
2
如果在您的phpinfo()上显示,您可以尝试telnet到Xdebug的端口(默认为9000)。 - tix3
@Wiseguy,我已经更新了问题。这是否意味着它已经成功加载/运行? - oshirowanen
@tix3,我已经更新了问题。这是否意味着它已经加载/正常工作了? - oshirowanen
2
如果扩展已经加载,它应该有自己的部分列出其配置指令。 - Wiseguy
在我的情况下,php.ini中的xdebug.default_enable=1是0。 - laggingreflex
13个回答

107

没有实际调试,我猜您无法肯定调试器是否有效。

但是您可以几乎确定——如果 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 已安装。否则,它未安装。


1
phpinfo() 只在“Additional .ini files parsed”中提到了 xdebug。现在正在检查您的其余建议。 - oshirowanen
3
刚刚尝试了xdebug_get_code_coverage(),但是出现了错误:在/var/www/xdebug.php的第5行,报错为致命错误:调用未定义的函数xdebug_get_code_coverage() - oshirowanen
8
好的。这相当明确地告诉您xdebug没有正确安装。 - Spudley
3
如果是这种情况,你需要打开/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 - Tony Morello
我基本上使用这个: php -r "xdebug_get_code_coverage();" - Buraco
显示剩余2条评论

82

运行

php -m -c

在您的终端中搜索[Zend Modules],如果已加载,则应该会出现在那里!

NB

如果您使用的是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

27
php --version 命令也会列出是否已加载 Xdebug。 - mfink
2
@mfink php --version 对我不起作用。在启动我的机器后,Apache 已经启动并工作正常,但是 php --version 显示 Xdebug,而 phpinfo() 没有显示 xdebug 部分。PHP 脚本执行不会在断点处停止。在运行 service apache2 restart 后,phpinfo() 显示了 xdebug 部分,并且调试工作正常。因此,由于某种原因,在机器启动期间 Apache 启动时未加载 xdebug。所以现在我每次启动都必须重新启动 Apache。 - Buttle Butkus

48
尝试以下操作,将返回xDebug存在。xDebug不存在。:
<?=sprintf('xDebug does%s exists.', extension_loaded('xdebug') ? '' : "n't");

在命令行界面:

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

29

在经历了近24个小时的痛苦奔跑尝试让xdebug与Netbeans 8.0.2一起工作后,我找到了一个解决方案,我希望这个方案适用于所有的Ubuntu和相关堆栈。

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

有时,如果您运行的是Linux设置并使用apt-get安装xdebug,则不会获得正确的xdebug版本。在我的情况下,我有最新的php版本但是旧的xdebug版本。这可能是由于我的当前Xubuntu版本。软件版本依赖于存储库,这些存储库依赖于您正在运行的操作系统版本。

解决方案:PHP有一个称为PECL的很好的扩展管理器。按照此处给出的说明进行操作即可。如评论中所指出的那样,首先您应该安装PHP的开发人员包,以使PECL工作:

sudo apt-get install php5-dev

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

sudo pecl install php5-xdebug

一旦你完成这个步骤,适当版本的xdebug就会被安装,但是还不能立即使用。此后,你需要启用它。我见过很多关于如何启用它的建议,但事实是PHP需要在客户端和服务器(在这种情况下是Apache)上启用某些模块。似乎最好的做法是使用内置的模块启用方法,称为php5enmod。使用方法可以在这里找到。

问题2:正确地启用模块

首先,你需要进入/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脚本,并运行它。如果一切正常,您应该看到以下内容:

enter image description here

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

xdebug in action

请记得检查Netbeans针对调试的配置,可以在工具/选项/PHP下找到。它应该看起来像这样:

Debugging configurations on Netbeans

希望这能解决这个相当晦涩和混乱的问题。

最好的祝愿!


2
对我有用,这个答案应该放在xdebug或netbeans网站上。 - Kurovsky
1
我必须安装PHP的开发者包才能让PECL正常工作:sudo apt-get install php5-dev. - untill
此外,php5enmod 不会在 ini 文件中创建任何链接,它可以很好地工作而不需要。 - untill
1
还有一件事:在ini文件中的[xdebug]指令对于使其正常工作至关重要。我曾因为原始ini文件中缺少[xdebug]而感到困惑,但如果没有它,它就无法正常工作。 - untill
你说得对,需要安装PHP的开发者包,我会相应地更新帖子。不过,我不确定你对php5enmod的评论。它会在我指定的文件夹中创建链接。是的,[xdebug]指令是必要的,我也会更新帖子以反映这一点。感谢您的反馈! - Théo T. Carranza
我尝试通过pecl安装xdebug,但失败了,出现以下错误信息:“parsePackageName(): "xdebug" is neither a valid version nor a valid state in "php5-xdebug" invalid package name/package file "php5-xdebug" install failed”。这是因为我的操作系统是MacOS吗? - Yevgeniy Afanasyev

14

为了扩展KsaR的答案,并提供一个可以从命令行检查xdebug的可能性:

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

11

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

php -r "xdebug_info();"

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


6

您可以运行这个小的PHP代码

<?php
phpinfo();
?>

复制整个输出页面,将其粘贴到此链接。然后进行分析。它会显示Xdebug是否已安装。并提供完成安装的指示。


3

如果您正在使用Eclipse,请注意,在XDebug模式下运行时,魔术常量__FILE__将始终被评估为:

xdebug://debug-eval

如果您的会话处于 XDebug 状态,则以下检查将返回 true:
$is_xdebug = false !== strpos(__FILE__,'xdebug'); // true while on XDebug

2
在你的问题中提到,你的phpinfo表明apache正在加载xdebug的配置文件/etc/php5/apache2/conf.d/xdebug.ini。在许多在线说明中,你可能会注意到它们要求你将xdebug配置放在php.ini中(这也是我所做的)。然而,如果配置设置为/etc/php5/apache2/conf.d/xdebug.ini,则应该从/etc/php5/apache2/php.ini中删除[XDebug]配置设置,并将其放在/etc/php5/apache2/conf.d/xdebug.ini中。一旦我从/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 restart

然后就可以工作了!


1
请注意,使用xDebug 3时,配置选项已更改。PhpStorm手册:配置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();"

这很重要,因为我在新安装的Eclipse上发现默认的xdebug配置设置为使用9000端口而不是9003端口。这意味着当运行调试配置时,Eclipse会一直“等待xdebug响应”,当然永远不会到达,因为它正在监听错误的端口。 - Robbie Jackson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接