PhpStorm + Xdebug远程调试冻结了

时间:2018-02-01 21:58:30

标签: php phpstorm xdebug

我已经在PhpStorm上使用Xdebug设置了PHP调试来命中本地主机。 “智能PHP监听”或手动调试运行一切正常,除非我已经到了代码看起来像

的程度
$aOptions = array (
        'http' => array (
                'header' => "Content-Type: application/x-www-form-urlencoded\r\n$sBits",
                'method' => 'POST',
                'content' => http_build_query ( $aData )
        )
);

$rContext = stream_context_create ( $aOptions );
$sResult = file_get_contents ( $sUrl, false, $rContext );
return \json_decode ( $sResult );

并被困在一条线上

$sResult = file_get_contents ( $sUrl, false, $rContext );

带有错误消息

file_get_contents(http://localhost:8888/data/?/Ajax/&q[]=/0/): failed to open stream: HTTP request failed!

但是当我运行调试之后,该行将完成所有工作。

PhpStorm和Xdebug已经设置

  • 设置| PHP |调试|最大同时连接 - > 5.

xdebug.remote_autostart = 1

任何线索,为什么Xdebug在没有调试的情况下挂起它可以传递任何问题?

2 个答案:

答案 0 :(得分:0)

您也在file_get_contents()来电中调用localhost。它是同一个端口吗?如果xdebug也在那里踢,那么该请求将被保持(将不会完成)并且最终file_get_contents将超时。

是否可以从PHP Storm访问该代码?如果是这样,你应该跳到那。否则尝试使用cookie触发的xdebug运行,因此只有主请求会触发它。

xdebug.remote_autostart = 1表示当此设置设置为1时,Xdebug将始终尝试启动远程调试会话并尝试连接到客户端,即使GET / POST / COOKIE变量不存在也是如此。 [1]因此表明它可能是这个

我认为您只需要xdebug.remote_enable = 1然后使用您的浏览器的扩展/插件(大多数浏览器都有启用/禁用xdebug插件)来仅在您的主要请求上触发xdebug

[1] https://xdebug.org/docs/remote

答案 1 :(得分:0)

根据simultaneous debugging sessions的JetBrains文档,我可以通过添加建议的代码来启动子请求的调试器会话来修复它,如下所示

$aOptions = array (
        'http' => array (
                'header' => "Content-Type: application/x-www-form-urlencoded\r\n$sBits",
                'method' => 'POST',
                'content' => http_build_query ( $aData )
        )
);

$debuggingQuerystring = '';
if (isset($_GET['XDEBUG_SESSION_START'])) { // xdebug
     $debuggingQuerystring = '?XDEBUG_SESSION_START=' . $_GET['XDEBUG_SESSION_START'];
}
if (isset($_COOKIE['XDEBUG_SESSION'])) { // xdebug (cookie)
     $debuggingQuerystring = '?XDEBUG_SESSION_START=PHPSTORM';
}

$rContext = stream_context_create ( $aOptions );
$sResult = file_get_contents ( $sUrl.$debuggingQuerystring, false, $rContext );
return \json_decode ( $sResult );