启用 xdebug 远程调试使 apache 服务器非常慢

Posted

技术标签:

【中文标题】启用 xdebug 远程调试使 apache 服务器非常慢【英文标题】:enabling xdebug remote debug makes apache server very slow 【发布时间】:2013-07-18 03:52:38 【问题描述】:

如果我通过设置xdebug.remote_enable=1 启用xdebug,apache 服务器会变得很慢;一旦我将设置更改为0,就正常了。

我在这里发现了同样的问题:XDebug really slow,但答案没有帮助。我没有启用分析:

xdebug.profiler_enable=0
xdebug.auto_trace = 0
xdebug.trace_output_dir = /tmp/xdebug
xdebug.trace_output_name = trace.%c

我检查了 /tmp/xdebug 文件夹下没有任何内容。

当启用 xdebug 远程调试并且我在 phpStorm 中启用调试侦听时,在断点处停止需要很短的时间,但没有禁用 phpstorm 调试侦听那么慢。

我的环境是:php + apache + xdebug 在本地 centos VM 上,我的 mysql db 和 PHPStorm 在 Windows 桌面上进行开发。 MySQL 并不慢。

感谢您的帮助。

【问题讨论】:

是的! xdebug 使代码执行更慢(不是非常慢,但更慢),即使您没有进行调试 - 仅仅是因为它跟踪内部发生的事情(函数调用及其参数;监视可能的异常等)。您还有哪些其他 xdebug 选项? 这不是我的情况。我一直在使用 xdebug。我的问题是启用远程调试:当 xdebug.remote_enable=1 但在 IDE(PHPStorm)中禁用调试侦听时,它变得非常慢。在任何其他情况下它都不慢。 再一次:你还有什么其他的 xdebug 设置?因为 .. 如果您已将 xdebug 配置为在 每个 请求上建立连接 .. 并且调试客户端(在我们的例子中为 PhpStorm)没有响应(未侦听).. 您将看到 1-2 秒的延迟每个请求(当 xdebug 尝试建立连接时)。 以下是从 phpinfo() 复制而来的。值得一提的是,我的案例不仅仅是延迟2秒,超过1分钟,太慢了无法工作。 xdebug support enabled 版本 2.1.4 支持的协议 Revision DBGp - Common DeBuGger Protocol $Revision: 1.145 $ Directive Local Value Master Value xdebug.auto_trace Off Off xdebug.collect_assignments Off Off xdebug.collect_includes On On On xdebug.collect_params 4 4 xdebug.collect_return Off Off xdebug.collect_vars Off Off xdebug.default_enable On On xdebug.dump.COOKIE no value no value xdebug.dump.ENV no value no value xdebug.dump.FILES no value no value xdebug.dump.GET no value no value xdebug.dump.POST no value no value xdebug.dump.REQUEST no值 没有值 xdebug.dump.SERVER 没有值 没有值 xdebug.dump.SESSION 没有值 没有值 xdebug.dump_globals 开 开 xdebug.dump_once 开 开 xdebug.dump_undefined 关 关 xdebug.extended_info 开 开 xdebug.file_link_format 没有值 没有值 xdebug。 idekey root PHPSTORM 【参考方案1】:

如果有人仍然在 Windows 平台上遇到缓慢的 xdebug,减少断点的数量对我有用。无论出于何种原因,每个断点都会减慢调试速度...

【讨论】:

【参考方案2】:

对我来说,我有

xdebug.remote_connect_back = 1

这会减慢一切并停止远程调试工作。删除后,一切正常。

【讨论】:

【参考方案3】:

我在使用 docker 容器和 Visual Studio Code 时遇到了同样的问题,使用了这个

; disables xdebug traces in error messages
xdebug.default_enable = "Off"

感谢@tomáš-fejfar

【讨论】:

【参考方案4】:

对我来说,Xdebug 版本 2.7.2 在包含供应商的 autoload.php 时速度很慢 Xdebug ersion 2.6.0 就好了。

【讨论】:

不幸的是,如果您正在运行 PHP 7.3+,这似乎是不可能的,因为 XDebug 2.6.2 在 PHP 7.2 处停止【参考方案5】:

有时如果你有其他服务在 9000 端口工作,Xdebug 将无法在 9000 端口连接到他的服务器,这会使其变慢,因为每次请求都会超时。

尝试更改 xDebug 正在侦听的默认端口(9000),我使用 9090 作为示例,但您可以使用您拥有的任何空闲端口:

xdebug.remote_port=9090

然后记得更改 xDebug 在你的 IDE 上监听的端口,我使用的是 Visual Studio Code:


    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        
            "name": "Listen for XDebug",
            "type": "php",
            "request": "launch",
            "port": 9090,
            "log": true
        ,
        
            "name": "Launch currently open script",
            "type": "php",
            "request": "launch",
            "program": "$file",
            "cwd": "$fileDirname",
            "port": 9090
        
    ]

【讨论】:

【参考方案6】:

另外,如果您确实希望始终启用 xdebug.remote_autostart = 1,请在您的 Phpstorm 设置中尝试增加最大同时部分。这应该会减少挂起和阻塞,但根据我的经验,仍然会对性能产生影响。

【讨论】:

【参考方案7】:

在我的情况下,这是由

xdebug.remote_autostart = 1

php.ini 中设置。这会导致 xdebug 尝试在每个请求上连接到远程调试器。我在请求中有一些 PHP 处理的样式、auto_preppend_file 和其他 PHP 文件,对于它们中的每一个,它等待了大约 2 秒,这加起来是……像15秒左右。设置

xdebug.remote_autostart = 0

彻底解决了问题。 xdebug 仅在存在调试 cookie 时才连接。请注意如果您不在调试会话中,则需要删除调试 cookie/参数才能使此修复生效

这里是my config that I use to setup xdebug。

【讨论】:

简直太棒了,就我而言,我使用sublime text 并修改了文件:etc/php5/conf.d/xdebub.ini(结果相同)。非常感谢! 谢谢!当我没有监听 PHP 调试连接时,我的站点会超时。随着您的更改,它再次起作用:) 谢谢@Tomáš Fejfar 我设置了禁用两件事,请建议我这样做对吗? xdebug.remote_autostart = 0 xdebug.profiler_enable = 0 这是我一直在使用的配置:gist.github.com/tomasfejfar/4e8e27ece29b142a7ec7f54f4fa44872 对于没有 debug cookie 的情况有什么建议吗?【参考方案8】:

在我的情况下,性能低下是由于在 PHPStorm 中设置了 200 多个断点,xdebug 对每个请求都进行了评估。

在 PHPStorm 中清除这些断点可将每个请求的性能从 60 秒提高到 6 秒。

【讨论】:

【参考方案9】:

XDebug 的性能也很差(在 6 秒内而不是毫秒内加载验证码) 此页面上的评论让我找到了原因。

关闭分析器,加载时间除以 3。 仍然很慢,但已经更好了。

xdebug.profiler_enable = 0

【讨论】:

我在 MAMP 安装的 tmp 目录中有一堆文件(14GB!),即使我禁用了分析器,这些文件仍然会减慢速度。我删除了它们,它似乎工作得更好! 对我来说,这个设置大大减少了加载时间。谢谢 你仍然可以拥有 xdebug.profiler_enable = false xdebug.profiler_enable_trigger = true 它只会在 cookie 显示时启用分析【参考方案10】:

作为进一步参考...以防万一有人遇到相同/相似的问题...(60秒超时)

第一次仔细检查 xdebug.remote_autostart 已禁用以避免自动连接。 正如@LazyOne 指出的那样,@Tomáš Fejfar 也解释了。

xdebug.remote_autostart类型:布尔值,默认值:0 通常您需要使用特定的 HTTP GET/POST 变量来启动远程调试 (see Remote Debugging)。 当此设置设置为 1 时,Xdebug 将始终尝试启动远程调试会话并尝试连接到客户端,即使 GET/POST/COOKIE 变量是不存在。

有了这个,当调试 cookie 不存在时,我恢复我的正常速度... 但是!...当手动激活 cookie 时,我仍然从服务器获得 非常慢的响应(60 秒超时)。

所以,在阅读了Xdebug Documentation 并检查了我的配置之后, 我发现我启用了xdebug.remote_connect_back

xdebug.remote_connect_back类型:布尔型,默认值:0,在 Xdebug > 2.1 中引入如果启用, xdebug.remote_host 设置被忽略,Xdebug 将尝试连接到发出 HTTP 请求的客户端。它检查 $_SERVER['REMOTE_ADDR'] 变量以找出要使用的 IP 地址。请注意,没有可用的过滤器,任何可以连接到网络服务器的人都可以开始调试会话,即使他们的地址与 xdebug.remote_host 不匹配。

所以对服务器的所有调用都在尝试调试,这使得服务器非常缓慢且不安全。

禁用此选项并验证我有明确定义的xdebug.remote_host 指向我的机器,我得到了可接受的响应〜1 秒。并且仅在启用 cookie 时

简而言之,我的配置文件最终是这样的:

zend_extension             = "/absolute/path/to/your/xdebug-extension.so"
xdebug.remote_enable       = 1
xdebug.remote_autostart    = 0
xdebug.remote_connect_back = 0
xdebug.remote_host         = "192.168.1.2"
xdebug.remote_port         = 9000
xdebug.remote_handler      = "dbgp"
xdebug.remote_mode         = req
xdebug.remote_log          = "/tmp/xdebug.log"

注意:我在 etc/php5/conf.d/xdebug.ini 文件中而不是在 php.ini 中进行了此更改

编辑: 正如 @Riimu@jdunk 指出的那样 感谢两位,您可能还需要设置:* 请参阅 cmets 了解详情

xdebug.remote_cookie_expire_time = 0
// or
xdebug.remote_cookie_expire_time = -9999

【讨论】:

我还想指出,如果您使用 GET 值来激活调试器,您可能还想将 xdebug.remote_cookie_expire_time 设置为 0。否则 xdebug 将自动设置调试 cookie,这将在以后的调用中触发远程调试器。 @Riimu 你是救生员。我在互联网上的其他任何地方都找不到这个!除了这里(虽然没用)xdebug.org/archives/xdebug-general/0783.html 也可以(并且可能是一个好主意)将xdebug.remote_cookie_expire_time 设置为负值,例如-9999。这样,如果客户端的时钟比服务器的时钟慢一秒或更多,则 cookie 实际上不会被存储(因为它“尚未过期”)。【参考方案11】:

我正在使用 PHPStorm 7.1 和 Xampp 1.8.2 安装的 Apache 服务器,所有这些都在 Windows 8.1 下。在设置断点时,我确实在调试模式下遇到了 Chrome 和 PHPStorm 之间的缓慢互操作性。

通过安装 XDebug dll 的最新版本(使用 XDebug wizard 确定要下载的版本),将 dll 复制到 php/ext 目录中并更改 php.ini 以使新的 XDebug dll 显着提高速度将被加载。停止启动 Apache 并查看差异。

我可以验证,在使用内部 Eclipse Web 浏览器使用 Eclipse(带有 PDT 的 Juno)调试 Web 应用程序时,会产生类似的性能提升。

【讨论】:

谢谢!那成功了。 php.ini 设置对我没有任何影响。【参考方案12】:

这里可能发生了一些网络超时。找出问题所在的最佳方法是尝试调试命令行脚本。如果仍然有同样的问题,那么使用strace 看看它挂在什么上面:

export XDEBUG_CONFIG="idekey=yourname"
strace -tt -o /tmp/strace.log php full/path/to/script.php

然后看看/tmp/strace.log,看看减速发生在哪里。

【讨论】:

当启用xdebug远程调试时phpstorm停止调试监听,@Derick提供的命令也会被阻塞。所以我认为这就是 xdebug 的工作方式:您已在 apache 中启用 xdebug 远程调试,并已从 Web 浏览器或命令行启用 xdebug(它看起来 export XDEBUG_CONFIG="idekey=yourname" 命令启用命令行 xdebug ),但 IDE (PHPSTORM) 停止侦听,因此 xdebug 无法从 IDE 获得任何响应,因此停止。 不,当 IDE 没有监听时,连接将超时 - 不会阻塞。 是的,你是对的,它是超时,但对我来说它看起来被阻塞了。根据我的观察和谷歌搜索,这个超时是一分钟。但是没找到哪里改这个超时时间,我在httpd.conf里改了Timeout,在php.ini里改了default_socket_timeout,也没用,xdebug的超时时间还是60秒

以上是关于启用 xdebug 远程调试使 apache 服务器非常慢的主要内容,如果未能解决你的问题,请参考以下文章

PHPStorm、Xdebug 和远程调试(在 phpstorm 中使用 FTP)

PHP远程调试:XDebug无法连接JetBrains php Storm客户端

在远程服务器上的Docker内部进行Xdebug远程调试

phpstorm配置xdebug进行远程调试(ubuntu)

远程服务器上 Docker 内的 Xdebug 远程调试

使用 XDebug 进行 PHP 远程调试