调试PHP进程通过`proc_open`

时间:2015-12-28 20:28:19

标签: php eclipse phpunit xdebug

我正在尝试调试通过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_opendbgp://stdin启动的进程,这是有道理的,因为这些脚本来自字符串。

所以我的问题是如何让eclipse正确地使用fileuri="dbgp://stdin"回复这些首字母?

似乎Eclipse只在收到init数据包并且可以映射fileuri时才响应。但是dbgp://stdin的映射配置怎么样?

为了清楚起见,在proc_open开始的流程旁边,我的设置完全正常并且正常工作。这意味着我可以调试通过CLI或浏览器启动的脚本。

1 个答案:

答案 0 :(得分:0)

我也对此感兴趣。

我使用PHPStorm,IDE会在你在PHPUnit中提到的地方暂停调试。 PHPStorm会抱怨它无法映射名为/<path-to-file>/-的文件。通过复制调用fwrite()中传递的PHP脚本字符串,将其保存为本地某处的文件,然后将路径/<path-to-file>/-映射到文件I,我能够使其工作在本地保存。之后,PHPStorm将继续进行调试。

我认为类似的东西可以在Eclipse中运行。