【问题标题】:PHP with lengthy loop creating erratic server error具有冗长循环的 PHP 创建不稳定的服务器错误
【发布时间】:2012-07-07 21:02:27
【问题描述】:

我有一个 PHP 脚本,它可以拉下一堆 RSS 提要。为了防止发布者的服务器超载,我使用 PHP 睡眠功能来减慢速度。

整个脚本可能会持续几个小时。

如果我从 GoDaddy 上的 Cron 作业运行它,它会愉快地工作 5 到 10 分钟,然后返回服务器错误。我查了一下,PHP的最大执行时间是30秒,所以我不确定这是否是问题的原因。

如果我在我的 Mac 上运行该作业,我的本地 PHP 的默认最大执行时间也为 30 秒,但如果我从终端运行该脚本,它确实可以工作,但我不明白为什么。

如何循环超过 30 秒的脚本而不会遇到不可靠性问题?

帮助表示赞赏。

【问题讨论】:

    标签: php loops sleep


    【解决方案1】:

    简短的回答是使用set_time_limit(0) 来允许长时间运行的脚本。您的终端 (CLI) PHP 可能已将其设置为 0。您也可能内存不足,尤其是在 PHP 5.2 或更早版本上。将所有错误记录到一个文件中,然后检查它。

    您可以重写您的程序,以便能够在一次运行期间处理数据的子集。这种方法的好处是您可以使用它来运行 24/7 或每五分钟运行一次,这取决于 PHP 环境支持什么。您还可以一次运行多个实例,每个实例都处理自己的数据。

    【讨论】:

    • 谢谢马特。麻烦的是 GoDaddy(我了解大多数其他主机,不允许更改 time_limit。)您对子集的想法是一个很好的想法,因为每个 RSS 下载都非常快。但是,如何创建一个时间表以在两个小时内一次下载一个?我是否必须创建数百个 Cron 作业?
    • @Jeremy 也许您可以跟踪数据库中的下载内容和剩余内容,并以固定间隔运行脚本,然后让脚本根据之前的下载时间决定下载哪些提要。只是一个想法,虽然看起来有点模糊:)
    • @Jeremy,一个简单的方法是在数据库中放置一个列表。添加状态/pid 列。开始时,UPDATE job SET pid=$pid WHERE status IS NULL LIMIT 50。然后选择具有匹配 pid 的那些并在完成时更新它们的状态。每 X 分钟运行一次。您并不真正想要重叠的工作,尽管只要您跟踪 pid(或工作编号等)就不会受到伤害。存在更强大的解决方案,但这既简单又有效。
    • 有趣的想法。谢谢马特。我会试试的:)
    • 请注意,查询缺少 SET status='pending' 之类的内容,以防止并发脚本声明相同的记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多