PHP 脚本在使用 Cron 调用时无限执行
PHP script executes infinitely when called using Cron
我在托管时遇到了非常奇怪的问题。
我有脚本,可以使用 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 秒)结束的错误。但我知道脚本执行到最后一步都很好。
问题是什么?
Wget
我在使用基于 php 的 cronjob 时遇到了同样的问题。问题是,wget 本身可以超时。如果达到此超时,wget 将一次又一次地尝试。
尝试使用一些 wget 选项来确保它运行如您所愿运行。
示例:
wget -O /dev/null --tries=1 --timeout=600 'https://mywebsite.com/script.php'
- --tries 表示如果出现超时它将尝试执行多少次。
- --timeout 指定max exec。时间以秒为单位。
这些选项也可以在 cronjob 级别指定。
PHP 定时任务
如果可能的话,直接让 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 中有一个名为“max_execution_time”的值,其中定义了处理 php 请求的最大秒数。
您可能需要注意的另一个设置是“memory_limit”,它也在 php.ini 配置中定义。此配置定义最大值。一个 php 请求可以使用的内存。由于您的 cronjob 似乎 运行 持续 2-3 分钟,这可能意味着在您使用它时可能有大量数据存储在内存中。
请注意,任何请求都会使用这些限制。如果将它们设置为高,可能会导致服务器上的 CPU 负载出现问题,或者产生过多的 php 进程。
如果您有共享托管服务或类似服务,您可能无法更改任何这些设置。
我在托管时遇到了非常奇怪的问题。 我有脚本,可以使用 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 秒)结束的错误。但我知道脚本执行到最后一步都很好。
问题是什么?
Wget
我在使用基于 php 的 cronjob 时遇到了同样的问题。问题是,wget 本身可以超时。如果达到此超时,wget 将一次又一次地尝试。
尝试使用一些 wget 选项来确保它运行如您所愿运行。 示例:
wget -O /dev/null --tries=1 --timeout=600 'https://mywebsite.com/script.php'
- --tries 表示如果出现超时它将尝试执行多少次。
- --timeout 指定max exec。时间以秒为单位。 这些选项也可以在 cronjob 级别指定。
PHP 定时任务
如果可能的话,直接让 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 中有一个名为“max_execution_time”的值,其中定义了处理 php 请求的最大秒数。
您可能需要注意的另一个设置是“memory_limit”,它也在 php.ini 配置中定义。此配置定义最大值。一个 php 请求可以使用的内存。由于您的 cronjob 似乎 运行 持续 2-3 分钟,这可能意味着在您使用它时可能有大量数据存储在内存中。
请注意,任何请求都会使用这些限制。如果将它们设置为高,可能会导致服务器上的 CPU 负载出现问题,或者产生过多的 php 进程。
如果您有共享托管服务或类似服务,您可能无法更改任何这些设置。