【问题标题】:PHP script executes infinitely when called using Cron使用 Cron 调用 PHP 脚本时无限执行
【发布时间】:2017-09-21 12:25:26
【问题描述】:

我在托管时遇到了非常奇怪的问题。 我有脚本,可以使用这样的 URL 触发它

https://mywebsite.com/script.php

我需要这个脚本在两天内执行一次。

所以我创建了 Cron 工作,就像我的托管服务提供商建议我的那样。

wget -O /dev/null -q 'https://mywebsite.com/script.php'

它使用 wget 因为脚本需要一些额外的脚本 - 所以我的托管服务提供商说我需要创建这样的任务。

它运行了大约一个月,但几周后我遇到了问题。 由于某种原因,当我通过在浏览器中打开 URI 来运行脚本时,我和我的托管服务提供商无法理解 - 脚本执行得很好(我知道这是因为电子邮件是在 4 个不同的执行步骤中发送的)。 但是当 Cron 执行这个脚本时,它会无限执行 - 所以我会继续多次收到电子邮件,直到我重命名脚本或删除它。

脚本执行时间约为 2-3 分钟。因此,当我从 URL 运行它并等待它完成时 - 我在屏幕上收到请求时间(60 秒)结束的错误。但我知道脚本在最后一步之前都可以正常执行。

有什么问题?

【问题讨论】:

  • 设置set_time_limit(60*10)并确保你的cron在出错后不会重试
  • 听起来你的脚本没有结束,浏览器只是因为它达到最大执行时间而停止。你能展示你的代码吗?
  • 所以当我从 URL 运行它并等待它完成时 - 我在屏幕上收到请求时间(60 秒)结束的错误,这意味着存在问题脚本。它只是因为请求超时而停止。所以你需要显示你的代码

标签: php cron cron-task


【解决方案1】:

Wget

我在使用基于 php 的 cronjob 时遇到了同样的问题。问题是,wget 本身可能有超时。如果达到此超时,wget 将一次又一次地尝试。

尝试使用一些 wget 选项来确保它按您希望的方式运行。 示例:

wget -O /dev/null --tries=1 --timeout=600 'https://mywebsite.com/script.php'
  • --tries 表示如果出现超时,它将尝试执行多少次。
  • --timeout 指定最大执行次数。以秒为单位的时间。 这些选项也可以在 cronjob 级别指定。

PHP Cronjobs

如果可能的话,让 PHP 直接运行你的 cronjob 可能是一个更好的选择。如果你知道服务器的 php 目录,你可以创建一个类似的 cronjob

/usr/bin/php /srv/www/yousite/html/script.php

在这种情况下,您没有像 wget 这样的第三方程序可以依赖。这是否有帮助取决于 cronjob 的构建方式。例如,如果您的 cronjobs 使用 $_SERVER 变量,这将不起作用。

在将任何 PHP 文件用作 cronjob 之前,您需要检查一些设置。

请记住,php.ini 中设置的 php 配置通常也会对 PHP Cronjobs 上的意外错误产生影响。在 php.ini 中有一个名为“ma​​x_execution_time”的值,其中定义了处理 php 请求的最大秒数。

您可能想要关注的另一个设置是“memory_limit”,它也在 php.ini 配置中定义。此配置定义了最大值。一个 php 请求可以使用的内存。由于您的 cronjob 似乎运行了 2-3 分钟,这可能意味着在您使用它时可能有很多数据存储在内存中。

请注意,任何请求都会使用这些限制。如果将它们设置为高,则可能会导致服务器上的 CPU 负载出现问题,或者产生过多的 php 进程。

如果您有共享托管服务或类似服务,您可能无法更改任何这些设置。

【讨论】:

  • 1) 我应该在参数中保留 -q 吗? 2)我应该添加 -0 吗?
  • @moonvader -O 参数只指定结果的存储位置。所以我肯定会留下 -O /dev/null,因为您不希望保存结果。 -q 只是告诉 wget 在“安静”模式下使用它。 Wget 不会创建任何输出。因此,您的规范中的 -O 和 -q 只是告诉 cronjob 生成或保存任何输出。要完全理解和查看 wget 的所有可能选项,您可以查看the documentation
  • 很好的答案!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-03
  • 1970-01-01
  • 2023-03-25
  • 2023-03-10
  • 1970-01-01
相关资源
最近更新 更多