【问题标题】:Understanding message "Cannot accept external Xdebug connection: Cannot evaluate expression 'isset($_SERVER['PHP_IDE_CONFIG'])'"了解消息“无法接受外部 Xdebug 连接:无法评估表达式 'isset($_SERVER['PHP_IDE_CONFIG'])'”
【发布时间】:2016-01-25 16:11:38
【问题描述】:

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

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

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

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

仅供参考,我正在调试 Web 服务,因此,我将 Xdebug 配置为侦听所有 HTTP 请求,单击“开始侦听 PHP 调试连接按钮”(图中绿色),然后通过 Advanced Rest Client 启动请求(铬)。

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

我尝试了链接问题中的解决方案,但消息仍然存在。

这是我的 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

【问题讨论】:

  • 听起来你有一些用 PHP 编写的计划任务(最常见的原因)(由调度程序直接调用作为步骤之一)在 CLi 环境中执行(或者更好地说,不在上下文中运行实际的 Web 服务器)。 PhpStorm 需要服务器名称来区分连接(使用什么“PHP | Server”条目等),在您的情况下(通常是远程 CLI)它不存在(这是绝对正常的,因为您需要根据您的链接手动提供此类信息)。
  • 我可能只建议在Settings/Preferences | Languages & Frameworks | PHP | Debug 启用“通过未注册的服务器配置忽略外部连接”选项——应该帮助。请注意,如果您需要配置另一个服务器配置,则必须手动进行,或者如果您需要 IDE 的帮助,请禁用此选项。
  • 这正是我的意思——你的系统范围的调度程序(在你的 Linux 案例中是 cron)
  • 您可能的替代方案是:1) 在您的实际 PHP 代码中使用 remote_autostart=0 并使用 xdebug_break();(程序断点) 2) 具有不同的 PHP 安装(或至少不同的 php.ini 配置文件)为您开发的实际代码和用于普通任务的系统范围的 PHP(不应调试 - 没有 xdebug 没有问题(+ 代码运行速度大约快 2 倍))
  • 我也有同样的问题。这肯定是由来自/etc/cron.d/php509,39 * * * * root [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean 引起的。但我已经在我的 PhpStrom 中签入了 Ignore external connections...

标签: debugging phpstorm xdebug


【解决方案1】:

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

如果您想在系统上保留xdebug.remote_autostart=1,同时阻止sessionclean 启动远程调试连接,只需编辑sessionclean(这是一个简单的shell 脚本)并将-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";')

进入这个:

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

【讨论】:

    【解决方案2】:

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

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

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


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

    你有xdebug.remote_autostart=1。通过这个 xdebug 尝试调试它执行的 每一个 PHP 脚本。我了解您已启用此功能以简化您的开发生活(因为有时以其他方式(例如 cookie 或 GET/POST 参数)传递 xdebuger“立即调试”标志既困难又不方便),但正如您所见,这会造成一些不便.

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

    【讨论】:

      猜你喜欢
      • 2015-05-16
      • 2017-05-03
      • 2018-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 1970-01-01
      相关资源
      最近更新 更多