5

我有一个偶尔挂起的 php web 应用程序。当我导航到该页面时,即使最大执行次数为 210,它也会坐在那里尝试加载数小时。这是一个应用程序在代理后面使用 curl 来下载内容。错误报告设置为全部,但这并不重要,因为页面是空白并挂起的。

我在调试挂起的 PHP 进程时找不到任何东西。

4

5 回答 5

2

最后我检查了一下,HTTP/IO 操作发生在 php 时间之外,因此 CURL 可能正在消亡或超时。

它的 IO,所以 php 只是抛出一些系统库,然后调用“select”等待它回​​来。

如果它不回来.. php 代码甚至不会循环,因此甚至不会知道它不会回来。

于 2008-11-05T03:25:01.183 回答
1

我敢打赌它是一个卷曲问题。几年前我有一个类似的问题,我添加了一个特定的 curl 选项,有时会挂起脚本。我希望我能确切地记住问题是什么,但我相信最终是 curl 链接到了下面的错误库。(编辑)实际上,我很确定在我的情况下它是 SSL 库,因为 curl 使用的是旧版本的 openssl。

我建议curl_setopt()首先删除所有呼叫,然后将它们重新添加以查看是否可以隔离错误。我如果你在命令行上运行等效的 curl 命令,你可能会立即看到错误。

我通过更新 curl 正在使用的 openssl 库来修复它。

于 2008-11-05T04:09:00.750 回答
1

要查看幕后发生的事情,您可以安装 xdebug,然后启用触发分析 (?XDEBUG_PROFILE=1)...它将输出日志到与 kcachegrind/etc 兼容的文件系统...您可以使用它来查看执行悬而未决的地方。

当然,这很可能是卷曲问题....

于 2008-11-05T05:56:10.190 回答
0

This is going to sound lame, but just open a file handle at the very start of your page request, then start doing fwrites to /tmp/debug.txt . See where the last one gets written, and then start echoing various variable values out into the file in that area. Use the theory of binary search to distribute your fwrites into finer and finer sections of resolution on your code.

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");
于 2008-11-05T18:02:43.143 回答
0

Xdebug是一个好主意,如果没有帮助,我还建议通过 ktrace、strace 或 truss 运行您的网络服务器。它向您确切显示了它的作用以及它可能挂在哪里。

听起来好像存在临时连接问题,或者您的应用程序依赖的其他东西被阻止了。

如果您使用 Apache,请查看Apache HTTP 调试指南。该指南有点以 *nix 为中心,但可以应用于任何网络服务器。

除了调试您的网络服务器之外,我还建议您添加检查您的代理是否始终处于启动/响应状态并且下载源始终可用。可以使用nagios之类的工具或Pingdom之类的 3rd 方服务添加这些检查。最后但同样重要的是,它也可能是一个临时的 DNS 问题,因此您可以使用 IP 连接到代理和下载源和/或添加对 DNS 服务的监控。

高温高压

于 2008-11-05T17:03:28.690 回答