调试挂起的php
我有一个偶尔挂起的php web应用程序。当我导航到页面时,它会在那里等待数小时,即使最大执行量是210。这是一个应用程序,它在代理后面使用curl来下载东西。错误报告设置为all,但这并不重要,因为页面为空白且挂起调试挂起的php,php,debugging,process,hung,Php,Debugging,Process,Hung,我有一个偶尔挂起的php web应用程序。当我导航到页面时,它会在那里等待数小时,即使最大执行量是210。这是一个应用程序,它在代理后面使用curl来下载东西。错误报告设置为all,但这并不重要,因为页面为空白且挂起 我找不到任何关于调试挂起的PHP进程的信息。上次我检查时,HTTP/IO操作发生在PHP时间之外,因此可能是CURL正在消亡或超时 它是IO,所以php只是抛出到某个系统库,然后调用“select”等待它返回 如果它不回来。。php代码甚至不会循环,因此甚至不知道它不会回来 我敢打
我找不到任何关于调试挂起的PHP进程的信息。上次我检查时,HTTP/IO操作发生在PHP时间之外,因此可能是CURL正在消亡或超时 它是IO,所以php只是抛出到某个系统库,然后调用“select”等待它返回
如果它不回来。。php代码甚至不会循环,因此甚至不知道它不会回来 我敢打赌这是一个卷发问题。几年前,我添加了一个特殊的curl选项,这个选项偶尔会挂起脚本,我也遇到了类似的问题。我希望我能准确地记得问题是什么,但我相信最终的结果是curl链接到了错误的库。(edit)实际上,我很确定我的例子中是SSL库,因为curl使用的是较旧版本的openssl 我建议首先删除所有
curl\u setopt()
调用,然后再将它们重新添加进来,看看是否可以隔离错误。我认为如果在命令行上运行等效的curl命令,您可能会立即看到错误
我通过更新curl使用的openssl库修复了它。要查看幕后发生的情况,可以安装xdebug,然后启用触发式评测(?xdebug_PROFILE=1)。。。它将向与kcachegrind/etc兼容的文件系统输出日志。。。。可以用来查看执行挂起的位置 当然,这很可能是一个卷曲问题……是一个好主意,如果没有帮助,我还建议通过ktrace、strace或truss运行您的Web服务器。它准确地向你展示了它的功能和可能悬挂的位置 听起来好像存在临时连接问题,或者应用程序所依赖的其他东西被阻止 如果您使用Apache,请检查。该指南有点以*nix为中心,但可以应用于任何Web服务器 在调试Web服务器的基础上,我还建议添加检查代理是否始终处于启动/响应状态,以及下载源是否始终可用。可以使用类似工具或类似第三方服务添加这些检查。最后但并非最不重要的一点是,这也可能是一个临时DNS问题,因此您可以使用IPs连接到代理和下载源和/或添加对DNS服务的监控
HTH这听起来很蹩脚,但只需在页面请求的最开始打开一个文件句柄,然后开始编写/tmp/debug.txt。查看最后一个变量的写入位置,然后开始将各种变量值回送到该区域的文件中。使用二进制搜索理论将您的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");