了解消息"无法接受外部Xdebug连接:无法评估表达式#setset($ _ SERVER [' PHP_IDE_CONFIG'])'"

时间:2016-01-25 16:11:38

标签: debugging phpstorm xdebug

我使用PHPstorm作为我的主要PHP开发环境和XDebug来调试我的应用程序。

我唯一的问题是消息"无法接受外部Xdebug连接:无法评估表达式' isset($ _ SERVER [' PHP_IDE_CONFIG'])'"不时出现。

我已经看到问题here以及JetBrains支持(herehere)的一些解决方案,但我的问题有点不同&因为我CAN正常调试,但消息继续出现。

请参阅下面的事件日志的打印。显然,该消息每30分钟出现一次。

event log of phpstorm

仅供参考,我正在对一个web服务进行重新分配,因此,我将Xdebug配置为侦听所有HTTP请求,然后单击“开始侦听PHP调试连接”按钮" (图中为绿色)然后通过Advannced Rest Client(Chrome)启动请求。

正如我所说,我可以毫无问题地进行调试,所以我只想了解这条消息。它会引起任何问题吗?难道我做错了什么?我可以禁用此消息吗?怎么样?

我在链接的问题中尝试了解决方案,但信息仍在那里。

这是我的Xdebug配置:

[Zend]
zend_extension="/usr/lib/php5/20131226/xdebug.so"
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_autostart=1
xdebug.remote_connect_back=0

2 个答案:

答案 0 :(得分:9)

您的描述(重复性任务)+屏幕截图(完全每30分钟发生一次)表明您有一些任务由某些计划执行(系统范围的调度程序 - Linux案例中的cron)并且它是用PHP编写的(PHP脚本由调度程序直接调用或作为主任务中的一个步骤。

此类任务在CLI环境中执行(或者,对于您的情况更好的措辞,不在实际Web服务器的上下文中运行)。当PhpStorm收到传入的调试请求(在IDE之外启动)时,它需要一些信息来确定要使用的设置(要使用哪个PHP | Servers条目)。当PHP在Web服务器上下文中执行时,这些信息通常(大多数情况)已经存在,并且在终端(CLI)中执行时它不存在,因此您必须provide it manually

最简单的解决方案是Ignore external connections through unregistered server configurations启用Settings/Preferences | Languages & Frameworks | PHP | Debug选项。请注意,如果您需要配置另一个服务器配置(对于大多数项目而言很少发生),您将需要手动执行此操作,或者如果您需要IDE的帮助,请禁用此选项。

Cronjob是重复性的真正原因。另一个问题是xdebug 实际上试图调试它。 理想它根本不应该发生,你最好配置你的环境,正常任务使用普通的PHP安装(没有xdebug)和开发环境使用单独的PHP安装或至少使用单独的php.ini配置。仅启用xdebug已使脚本运行速度降低2倍左右,例如,composer会在检测到xdebug启用时通知您。

你有xdebug.remote_autostart=1。使用此xdebug尝试调试它执行的每个PHP脚本。我知道你已经启用了这个来简化你的开发生活(因为有时候传递xdebuger&#34很难和不方便;现在调试这个"以其他方式标记(例如cookie或GET / POST参数))但是你可以看到它造成了一些不便。

此处的一个可能选项(除了上述单独的配置之外)是在您的实际PHP代码(程序断点)中使用xdebug.remote_autostart=0并使用xdebug_break();。但由于其他原因,这可能不方便 - 需要修改脚本源代码以启用/禁用调试。

答案 1 :(得分:1)

正如其他人提到的,这是由sessionclean脚本(在我的机器上,位于:/usr/lib/php/sessionclean)引起的,每30分钟由cron调用一次。

如果要在阻止xdebug.remote_autostart=1启动远程调试连接的同时在系统上保留sessionclean,只需编辑sessionclean(它是一个简单的shell脚本)并添加{{ 1}}调用-d "xdebug.remote_autostart=0"命令。

例如,在我的系统上,我不得不改变这一行:

php

进入这个:

session_config=$(PHP_INI_SCAN_DIR=/etc/php/${version}/${conf_dir}/conf.d/ php${version} -c /etc/php/${version}/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')