我正在尝试调试通过proc_open
启动的PHP进程。这意味着脚本代码本身作为字符串通过fwrite
传递。例如。通过使用PHPUnit进行如下调用:
$php = \PHPUnit_Util_PHP::factory();
$response = $php->runJob("<?php\nrequire 'some/framework/bootstrap.php';");
您可以在GitHub找到相关的源代码。作为调试器,我目前使用Xdebug和IDE Eclipse。
我对Xdebug的设置如下:
xdebug.remote_log=/tmp/xdebug.log
xdebug.idekey=ECLIPSE_DBGP
xdebug.remote_autostart = 1
xdebug.remote_enable = 1
xdebug.remote_host=192.168.1.80
问题是这些进程没有达到断点。当我查看日志(/tmp/xdebug.log
)时,我会看到这样的几个init
数据包(正好在fclose($pipes[0]);
之后的三个数据包):
<init xmlns="urn:debugger_protocol_v1"
xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
fileuri="dbgp://stdin"
language="PHP"
protocol_version="1.0"
appid="2091"
idekey="ECLIPSE_DBGP">
<engine version="2.2.5"><![CDATA[Xdebug]]></engine>
[...]
</init>
但Eclipse从来没有像对CLI(../vendor/phpunit/phpunit/phpunit -c [...]
)中的父进程那样响应:
<init xmlns="urn:debugger_protocol_v1"
xmlns:xdebug="http://xdebug.org/dbgp/xdebug"
fileuri="file:///var/www/vendor/phpunit/phpunit/phpunit"
language="PHP"
protocol_version="1.0"
appid="2103"
idekey="ECLIPSE_DBGP">
<engine version="2.2.5"><![CDATA[Xdebug]]></engine>
[...]
</init>
因此,这两个init
数据包之间的唯一区别是属性fileuri
。它包含通过proc_open
仅dbgp://stdin
启动的进程,这是有道理的,因为这些脚本来自字符串。
所以我的问题是如何让eclipse正确地使用fileuri="dbgp://stdin"
回复这些首字母?
似乎Eclipse只在收到init
数据包并且可以映射fileuri
时才响应。但是dbgp://stdin
的映射配置怎么样?
为了清楚起见,在proc_open
开始的流程旁边,我的设置完全正常并且正常工作。这意味着我可以调试通过CLI或浏览器启动的脚本。
答案 0 :(得分:0)
我也对此感兴趣。
我使用PHPStorm,IDE会在你在PHPUnit中提到的地方暂停调试。 PHPStorm会抱怨它无法映射名为/<path-to-file>/-
的文件。通过复制调用fwrite()
中传递的PHP脚本字符串,将其保存为本地某处的文件,然后将路径/<path-to-file>/-
映射到文件I,我能够使其工作在本地保存。之后,PHPStorm将继续进行调试。
我认为类似的东西可以在Eclipse中运行。