【问题标题】:Why php script may stop?为什么php脚本可能会停止?
【发布时间】: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 启动它不是很有用。

标签: php apache timeout


【解决方案1】:

我认为脚本的其余部分有问题,而不是 Apache。

尝试使用register_tick_functionthis 之类的光分析器来分析您的应用程序并记录memory usage,可能就是这样。

【讨论】:

  • 我不确定这是否可能。脚本应该以“完成”消息或某种错误结束。我仔细检查了整个文件中的exitdiereturn,它们不会给出任何消息,但没有。我检查了内存使用情况(阅读问题)。
猜你喜欢
  • 2021-04-11
  • 1970-01-01
  • 2021-08-21
  • 2020-02-09
  • 2012-08-06
  • 1970-01-01
  • 2021-06-09
  • 1970-01-01
  • 2017-07-24
相关资源
最近更新 更多