【发布时间】:2012-08-25 00:32:42
【问题描述】:
我在 php 中运行了很长的任务。这是一个网站爬虫,它必须有礼貌并且每页休眠 5 秒以防止服务器超载。脚本开头:
ignore_user_abort(1);
session_write_close();
ob_end_clean();
while (@ob_end_flush());
set_time_limit(0);
ini_set('max_execution_time',0);
几个小时后(3 到 7 小时之间)脚本死机,没有任何明显的原因。 我查过了
- apache 错误日志(无)
- php_errors.log(无)
- 错误输出(10 578 467b 的调试输出,无错误)
- 内存消耗(稳定,大约 3M 从
memory_get_usage(true)每 5 秒检查一次,限制设置为 512M)
这不是浏览器,因为我使用 wget 和 chrome 来检查类似的原因。 输出每 2-3 秒发送到浏览器,所以我认为这不是问题 + 我忽略了用户中止。
还有其他地方我可以检查以找到问题吗?
【问题讨论】:
-
如果它在 apache 容器 (mod_php) 中运行,我可以想象它最终会在不通知您的情况下终止进程:)
-
你能独立运行它吗(在 Apache 之外)?
-
部分地做这个怎么样?扫描 500-1000 个链接,然后使用一些参数调用相同的脚本以从偏移量开始
-
这是由 cron 控制的吗?如果是这样,我建议强制脚本运行一段设定的时间,然后使用 cron 在不久之后重新启动它(如果你现在找不到是什么杀死它并阻止它)
-
phpinfo 显示 CGI/FastCGI,所以我猜是 suPHP。我不想通过 cron 运行它,因为它是任务驱动的工具。进程的前几秒对用户很重要 - 应该使用不同的配置重新启动脚本,还是继续运行。等待 cron 启动它不是很有用。