使用 PHPStorm 解决 PHPUnit xdebug 远程调试问题

Posted

技术标签:

【中文标题】使用 PHPStorm 解决 PHPUnit xdebug 远程调试问题【英文标题】:Trouble shooting PHPUnit xdebug remote debugging with PHPStorm 【发布时间】:2012-04-06 14:22:27 【问题描述】:

我正在尝试让 Xdebug 远程调试工作,我使用 phpStorm 作为我的 IDE。 我的网络服务器/代码托管在远程机器(亚马逊 ec2)上。

我在远程服务器上的 php.ini 中有以下几行(PHP CLI,因为我正在进行 PHPUnit 调试)

zend_extension=/usr/lib/php5/20090626+lfs/xdebug.so
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_handler = dbgp
xdebug.remote_mode = req
xdebug.remote_connect_back = 1
xdebug.remote_port = 9000

由于我是在我的家庭网络中编程,我在我的个人路由器上打开了端口 9000。 我将 PHPStorm 的 xdebug 服务器设置为使用 Xdebug 指向端口 80 上的远程服务器,因为它是调试器。

现在,当我尝试从 PHPStorm 调试 PHPUnit 测试时,它只是说 '等待带有 ide 键 '12115' 的传入连接 除了,它每次都会选择一个随机的 ide 密钥(我希望 PHPUnit 在服务器本身上设置 idekey)

我已经尝试让它工作超过 10 个小时,我尝试在 php.ini 中定义我的特定 remote_host 而不是使用 remote_connect_back 但这也不起作用。我曾尝试在 php.ini 中设置一个 idekey,但效果不佳。

有没有办法确认 Xdebug 在网络服务器端按预期工作?如何在不使用 Phpstorm 的情况下测试我的 Xdebug 设置,我不知道这是我的家庭网络和远程服务器之间的连接问题还是什么。

任何有助于缩小问题范围的指导都会很棒。

【问题讨论】:

我最近尝试为从本地笔记本电脑到远程服务器的端口 9000 创建一个 ssh 隧道,然后再尝试调试,但它似乎仍然不起作用(我将设置 xdebug.remote_host 更改为环回地址 127.0.0.1)。有什么建议吗? 我将启用 xdebug 日志记录并使用 tcpdump 查看是否正在建立连接,然后为 PhpStorm 启用调试日志记录:devnet.jetbrains.net/docs/DOC-1202。试试它是否适用于零配置方法:blog.jetbrains.com/webide/2011/02/…. 【参考方案1】:

我知道这个问题有点老了,但是由于我遇到了同样的问题并且刚刚找到了解决方案,所以我决定在这里为任何有兴趣的人发帖。

我的解决方案很大程度上基于 Rafael Dohms 在 他的博文标题为:Debugging PHPUnit Tests in NetBeans with XDebug

环境

IDE:PHPStorm 6.0.2 服务器:WAMP 服务器(32 位和 PHP 5.4.3)2.2E XDebug:2.2.2

XDebug

zend_extension=c:\wamp\bin\php\php5.4.3\ext\php_xdebug-2.2.2-5.4-vc9.dll
xdebug.extended_info=1
xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000
xdebug.remote_log=c:/wamp/tmp/xdebug/xdebug_remote.log

上述配置参数进入 CLI 的“php.ini”文件。对于默认 WAMP 安装,此文件的完整路径为:C:\wamp\bin\php\php5.4.3\php.ini

PHPStorm

首先,您必须创建一个“服务器配置”(谷歌“创建服务器配置 - JetBrains”以获取有关该主题的官方文档),将“Xdebug”指定为“调试器”。

然后,创建一个新的“PHP 远程调试配置”(google “Creating and Editing Run/Debug Configurations - JetBrains”以获取有关该主题的官方文档)在“配置”部分下指定以下值:

服务器:上面创建的服务器 IDE 密钥:PHPSTORM

现在,选择该配置并按“调试”按钮(或“Shift + F9”)。 PHPStorm 将显示“调试”面板并显示消息:Waiting for incoming connection with ide key 'PHPSTORM'

最后,“运行”您的 PHPUnit 测试。有几种方法。其中之一是:

右键单击 PHPUnit 测试所在文件的名称。 选择“运行文件名

就是这样! XDebug 将从这里开始控制。

【讨论】:

【参考方案2】:

如果您运行的是 Xdebug 2.2.0RC1,那么远程调试日志 (http://xdebug.org/docs/all_settings#remote_log) 将告诉您连接尝试成功和失败。这可能会确定问题出在 Xdebug 方面还是 phpstorm 方面。

【讨论】:

这样做我至少能够收集到一些东西:当我通过 php-cli 或命令行上的 'phpunit' 运行 php 文件时,xdebug 日志中会出现一些条目。但是当我通过我的 phpstorm 远程运行测试时,我可以获得测试结果,但是 xdebug 日志中没有添加任何条目。我仍然无法解决问题。【参考方案3】:

就我而言,问题是我在/etc/php/fpm/php.ini 中有xdebug 配置,但php-cli 使用/etc/php/cli/php.ini

【讨论】:

【参考方案4】:

由于我花了一天的时间才开始工作,所以我总结一下,学到了什么:

确保您更改的是正确的 php.ini,XAMPP 使用另一个 php.ini 和 php 版本,而不是 OS X Mavericks 上预装的版本。

定义一个日志文件,如果没有写入任何内容,则说明你修改了错误的 php.ini

在 phpstorm 中,您可以验证您的服务器连接并获得洞察力,如果您正在处理正确的 php.ini 或仍然有什么问题。

您必须更改调试设置(可能值得将端口更改为 9001)、服务器、所有 phpstorm 首选项和设置。

您必须设置 php 语言级别和解释器(使用您的 Apache mysql php 配置使用的那个),例如/Application/XAMPP/xamppfiles/bin,点击 ... 查看 Php 以及是否附加了调试器。您可能必须使用另一个版本的 xdebug。

在服务器中,您必须将主机定义为

http://yourdefinitionofprojectonlocalhost

通常使用端口 80 和 Xdebug。这里必须验证远程环境。

在debug下可以设置Debug Port,如果改成9001,在php.ini中也要改,选择Can Accept external Connections。

如果你不启用 Start 来监听 PHP Debug Connection,你就没有希望让它工作(图标在右上角或在 Run 菜单中)。

在编辑配置中...您必须定义一个 PHP Web 应用程序才能在运行菜单中使用调试。

我花了一天的时间才让它工作。主要问题是编辑错误的 php.ini(不要忘记在编辑后重新启动 apache)以及 xdebug 不适用于 php 版本。

如您所见,我在 php.ini 中尝试了很多选项,最终使用了在我的 mamp 目录中找到的 xdebug 版本:

;zend_extension="/usr/lib/php/extensions/no-debug-non-zts-20100525/xdebug.so"
zend_extension="/Applications/MAMP/bin/php/php5.5.10/lib/php/extensions/no-debug-non-   zts-20121212/xdebug.so"

[xdebug]
;xdebug.var_display_max_children = 999
;xdebug.var_display_max_data = 99999
;xdebug.var_display_max_depth = 100
;xdebug.remote_enable = 1
;xdebug.remote_port=9001
;xdebug.profiler_enable=1
xdebug.remote_connect_back=0
;xdebug.remote_handler=dbgp
;xdebug.remote_host=localhost
;xdebug.profiler_output_dir=/Users/mypath/tmp
xdebug.remote_log=/Users/mypath/xdebug.log
;xdebug.remote_mode=req

xdebug.remote_enable=1
xdebug.remote_handler=dbgp
xdebug.remote_mode=req
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9001

祝你比我更快的成功。

【讨论】:

【参考方案5】:

就我而言,当我将端口更改为 9000 以外的端口时,它开始工作。

Phpstorm 的 phpunit 命令现在是:

/usr/bin/php -dxdebug.remote_enable=1 -dxdebug.remote_mode=req -dxdebug.remote_port=9002 -dxdebug.remote_host=10.0.2.2 /var/www/application/vendor/phpunit/phpunit/phpunit --bootstrap /var/www/application/tests/Bootstrap.php --configuration /var/www/application/tests/phpunit.xml <testfile> --teamcity

【讨论】:

以上是关于使用 PHPStorm 解决 PHPUnit xdebug 远程调试问题的主要内容,如果未能解决你的问题,请参考以下文章

PhpStorm 令牌不匹配异常中的 PHPUnit 测试

使用 Docker 在 PhpStorm 中使用 PHPUnit

使用 PhpStorm 在 Homestead 环境中调试 PHPUnit 测试

使用 WSL-2 和 Docker 在 PhpStorm 中设置 PHPUnit:无法解析 PHPUnit 版本输出:无法打开输入文件

在 PhpStorm 2016.1 上使用 Laravel / Homestead 启用 PHPUnit 以

PhpStorm 中的 PHPUnit 引导程序