如何从CLI调试PHP CLI脚本

21
有没有人知道如何在命令行中调试CLI PHP脚本?我不想调试PHP网页——我没有PHP网页。我也不想调试远程脚本——我正在这个系统上运行/调试。目前我也不想尝试获取某些IDE(如Eclipse、PhpStorm或其他)来调试CLI PHP,我只是想在Linux命令行本身上调试一些PHP CLI脚本。在Perl中,这将简单地是 perl -d 。对我而言,调试脚本并不是弄清编译错误或其他简单的东西。对我而言,它是设置断点、运行代码、检查变量内容并能够在调试器中任意执行或评估('')。当然,以后我想将其配置到我选择的IDE中(此时为Eclipse),但我还没有成功将其工作。从CLI调试PHP CLI脚本对我来说是一个好的起点。谢谢。
以下是我尝试使用xdebug和/或Zend debugger与Eclipse配合使用的方法:
- 基础Eclipse版本Mars.1 Release 4.5。 - Eclipse PDT UI插件版本3.7.0.2015112 - 尝试使用pecl install xdebug安装xdebug。说我需要将“zend_extension=xdebug.so”添加到php.ini文件中。真的吗?哪个php.ini文件?我有几个: /etc/php5/cli/php.ini /etc/php5/apache2/php.ini /opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php53/php.ini /opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php.ini/opt/eclipse/plugins/com.zend.php.debug.debugger.php56.linux.x86_64_13.0.1.v20151112-2045/resources/php56/php.ini是一个php.ini文件的路径。Andromeda尝试在两个文件中添加zend_extension内容,即/etc/php5/cli/php.ini和/etc/php5/apache2/php.ini,并将Xdebug添加到phpinfo.php页面中。然后配置了Eclipse中的Debug Configuration使用xdebug进行调试,但遇到了"Launching renameUser" java.lang.NullPointerException错误。此外,Andromeda还安装了Zend Debugger并将以下内容添加到相同的两个php.ini文件中: zend_extension=/usr/lib/php5/20121212/ZendDebugger.so, zend_debugger.allow_hosts=127.0.0.1/32, 192.168.0.0/16, zend_debugger.expose_remotely=always。将调试配置更改为使用Zend Debugger并尝试调试,但收到"Error launching 'renameUser' The debug session could not be started. Please make sure that the debugger is properly configured as a php.ini directive."错误。之后,重新启动Eclipse,现在调试器尝试运行,但仅以255退出值终止,尝试运行/opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php-cgi。从命令行运行这个文件时得到如下输出:"Andromeda:/opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php-cgi"/opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/php5/php-cgi:在加载共享库libiconv.so.2时出错:无法打开共享对象文件:没有那个文件或目录。
发现/opt/eclipse/plugins/org.zend.php.debug.debugger.linux.x86_64_5.3.18.v20110322/resources/lib中有libiconv.so.2文件,并将LD_LIBRARY_PATH设置为包含该路径,但仍无法启动调试器,指出要确保调试器已正确配置为php.ini指令...烦人!
其他奇怪的事情:
当Eclipse启动时,它无法打开我的基于RSE的项目,因此显示上次运行的编辑缓冲区为空。
Eclipse将不再退出!选择文件:退出。没有任何反应。单击标题栏中的X - 没有任何反应。现在我必须杀死它才能关闭它!
4个回答

18

在命令行调试时,您需要告诉 PHP 您也想进行调试。

http://xdebug.org/docs/remote

说明:

export XDEBUG_CONFIG="idekey=session_name"
php myscript.php

假设xdebug已启用(无论它在哪个.ini文件中,但通常有一个每个操作系统的标准位置,在名为xdebug.ini的conf.d文件夹中自动包含)

这允许您调试cmdline脚本。

我个人使用带有Vdebug扩展的Vim(用于vim的xdebug)进行调试,除此之外只需要命令行。


1
我尝试过了,但没有成功。这个注释语法不起作用。抱歉,我已经尝试过了。Andromeda:export XDEBUG_CONFIG="idekey=session_name" Andromeda:php renameUser.php 创建用户密钥对象 完成 创建p4连接 PHP致命错误:无法在/opt/perforce/swarm/renameUser.php的第24行实例化P4\Connection\ConnectionInterface接口 PHP堆栈跟踪: PHP 1. {main}() /opt/perforce/swarm/renameUser.php:0 Andromeda: - Andrew DeFaria
@AndrewDeFaria 听起来你的 PHP 脚本在达到断点之前遇到了致命错误。 - Erfan

3
对我而言有效的方法是使用dephpugger。在这里找到了使CLI调试工作的步骤:https://hackernoon.com/how-debug-php-applications-with-dephpugger-98cc234d917c
之前我安装了xdebug并尝试了exussum的答案。
以下是我遵循的步骤,为了完整起见,请参考以下内容。
安装dephpugger:
composer global require “tacnoman/dephpugger”:”dev-master”

将DePHPugger应用于代码路径:
export PATH=$PATH:$HOME/.composer/vendor/bin

请确保在断点处的 PHP 文件中包含以下内容:

xdebug_break();

打开两个终端窗口。在一个窗口中运行:

dephpugger debug

在另一次运行中

dephpugger cli /path/file.php

用您的文件路径替换 /path/file.php。如果需要使用命令行参数运行 php 脚本,请将路径和参数放在引号中。这种方法似乎有点粗糙。我认为真正的诀窍是使用内置更好的调试器的语言进行编写。

2
这虽然有些取巧,但在私人脚本中它是最快的解决方案。 - Sam

2

exussums的答案对我有用。

此外,我在/etc/php/7.0/cli/conf.d/20-xdebug.ini中添加了以下内容。

zend_extension=xdebug.so

xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_handler=dbgp

xdebug.remote_enable=true
#xdebug.remote_enable=false

我必须执行以下操作:https://github.com/vim-vdebug/vdebug/issues/363


这是对我有效的方法。XDebug页面声称如果调试器和脚本在同一系统上运行,它将“只需工作”,但这是一个谎言。以远程环回的方式设置它可以解决问题。 - Daniel Garcia

0

能够在 PHP 脚本中设置断点需要加载某种调试器扩展,例如 XDebug 或 Zend Debugger。

然后,您需要一些与此调试器的接口来传达有关断点的意愿。我不熟悉 Perl 调试,但我没有听说过任何基于 PHP CLI 的调试 - 它总是在能够处理其中一个扩展的调试协议的 IDE 中进行。

当然,还有老式的 var_dump();die('hi'); 调试方法,但这并不包括在脚本结束后继续执行代码。;)


1
在 Perl 中,你只需要输入 perl -d script.pl 即可。调试器是内置的,并且可以直接使用。我不明白为什么 PHP 需要帮助!为什么它需要一个调试“协议”似乎有些愚蠢或者至少对于你只是编写 CLI 脚本的情况来说过于繁琐。在 Perl 中,调试器“扩展”简单地就是 perl5db.pl。当 -d 被指定后,Perl 会加载调试器并立即调用它。恭喜你,你现在在进行调试了!在 CLI 调试会话中,接口就是命令行界面!除此之外还能是什么呢? - Andrew DeFaria
好的,我有Eclipse(4.4 IIRC),我在Ubuntu 14.10上,我正在尝试调试的脚本最终需要在CentOS 5.6上运行。我尝试安装Zend调试器和XDebug,但都没有成功。当要求启动调试时,Eclipse要么什么也不做,要么显示错误对话框,说调试器配置不正确。也许如果您能给我提供精确的、逐步的说明,我可能能够做到这一点。我记得它告诉我将dummy.php放在我的Web服务器根目录下。但是我没有Web服务器,因为我没有Web应用程序需要调试。 - Andrew DeFaria
1
我认为,尽管PHP声称适合进行CLI工作,但它在CLI开发方面并不合适,特别是在调试方面。而且,var_dump和die是一种糟糕的调试方式!我想要运行来自供应商的PHP代码,并希望能够逐步进入和跟踪他们的代码,以便了解如何使用它。我不能在他们的代码中到处放置var_dump。(限制评论大小真是愚蠢) - Andrew DeFaria
也许你应该解释一下为什么认为需要调试 PHP CLI 脚本的权限。你遇到了什么问题?我知道搭建一个工作正常的 PHP 调试环境听起来很复杂,但这是每个 PHP 开发人员都做过或应该做的事情。然而,运行调试器并不是获取有关错误更多信息的唯一方法 - 还有错误消息和日志文件。你想要做什么? - Sven
1
就像我之前所说的,我正在尝试追踪执行一个使用来自供应商提供的PHP文件的多个类的PHP脚本。这些并不是实际上的错误,但我正试图逆向工程如何使用供应商提供的PHP对象,以便我可以调用它们来执行某个函数。但是,我真的需要解释为什么我想要使用调试器吗?总的来说,在这里或任何地方 - 你如何调试PHP脚本 - 特别是PHP CLI脚本?而且,我如何在此输入文本而不被限制在少量字符内? - Andrew DeFaria
显示剩余2条评论

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