【发布时间】:2010-09-20 19:49:24
【问题描述】:
我有一个偶尔挂起的 php Web 应用程序。当我导航到该页面时,它只会坐在那里尝试加载数小时,即使最大执行次数为 210。这是一个应用程序在代理后面使用 curl 来下载内容。错误报告设置为全部,但这并不重要,因为页面是空白且挂起的。
我在调试挂起的 PHP 进程时找不到任何东西。
【问题讨论】:
标签: php debugging process hung
我有一个偶尔挂起的 php Web 应用程序。当我导航到该页面时,它只会坐在那里尝试加载数小时,即使最大执行次数为 210。这是一个应用程序在代理后面使用 curl 来下载内容。错误报告设置为全部,但这并不重要,因为页面是空白且挂起的。
我在调试挂起的 PHP 进程时找不到任何东西。
【问题讨论】:
标签: php debugging process hung
我上次检查,HTTP/IO 操作发生在 php 时间之外,因此 CURL 可能正在消亡或超时。
它的IO,所以php只是抛出一些系统库,然后调用“select”等待它回来。
如果它不回来.. php 代码甚至不会循环,因此甚至不会知道它不会回来。
【讨论】:
要查看幕后发生的情况,您可以安装 xdebug,然后启用触发分析 (?XDEBUG_PROFILE=1)...它将输出日志到与 kcachegrind/etc 兼容的文件系统...您可以用于查看执行挂起的位置。
当然,这很可能是卷曲问题....
【讨论】:
我敢赌它是一个卷曲问题。几年前我有一个类似的问题,我添加了一个特定的 curl 选项,它有时会挂起脚本。我希望我能准确地记住问题是什么,但我相信最终是 curl 链接到了下面的错误库。 (edit) 实际上,我很确定这是我的情况下的 SSL 库,因为 curl 使用的是旧版本的 openssl。
我建议首先删除所有 curl_setopt() 调用,然后将它们重新添加以查看是否可以隔离错误。我认为如果您在命令行上运行等效的 curl 命令,您可能会立即看到错误。
我通过更新 curl 使用的 openssl 库来修复它。
【讨论】:
Xdebug 是个好主意,如果没有帮助,我还建议通过 ktrace、strace 或 truss 运行您的网络服务器。它可以准确地向您展示它的作用以及它可能挂在哪里。
听起来有一个临时的连接问题,或者您的应用程序依赖的其他东西被阻止了。
如果您使用 Apache,请查看Apache HTTP Debugging Guide。该指南有点以 *nix 为中心,但可以应用于任何网络服务器。
除了调试您的网络服务器之外,我还建议您添加检查您的代理是否始终处于启动/响应状态并且下载源始终可用。可以使用nagios 之类的工具或Pingdom 之类的第三方服务添加这些检查。最后但同样重要的是,它也可能是一个临时的 DNS 问题,因此您可以使用 IP 连接到代理和下载源和/或添加对 DNS 服务的监控。
HTH
【讨论】:
这听起来很蹩脚,但只需在页面请求的一开始就打开一个文件句柄,然后开始对 /tmp/debug.txt 进行 fwrites 。查看最后一个写入的位置,然后开始将各种变量值回显到该区域的文件中。使用二分搜索理论将您的 fwrite 分配到代码中越来越精细的分辨率部分。
i.e.
$fh = fopen("/tmp/debug.txt", "w");
fwrite($fh, "made it to here 1 \n");
//some code
fwrite($fh, "made it to here 2 \n");
//more code
fwrite($fh, "made it to here 3 \n");
【讨论】: