将 php 脚本作为 cron 作业运行 - 超时问题?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/13352388/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-25 05:14:11  来源:igfitidea点击:

Running php script as cron job - timeout issues?

phpcron

提问by Joel Joel Binks

I am coding a php script that does some back end stuff and needs to run every 8 hours or so. The script takes a while to execute. For the hell of it, I tried it from my browser and the connection to the server gets reset well before the script terminates. My question is - if I run it directly, ie. php -a file.php as a cron job, are there any internal time constraints on execution? This script may take 2-5 minutes to complete and cannot be interrupted. I've never done this before so I am not sure if php has quirks when running heavy scripts.

我正在编写一个 php 脚本,它执行一些后端操作,需要每 8 小时左右运行一次。该脚本需要一段时间才能执行。糟糕的是,我从浏览器中尝试了它,并且在脚本终止之前与服务器的连接很好地重置了。我的问题是 - 如果我直接运行它,即。php -a file.php 作为 cron 作业,执行是否有任何内部时间限制?此脚本可能需要 2-5 分钟才能完成且不能中断。我以前从未这样做过,所以我不确定 php 在运行繁重的脚本时是否有怪癖。

回答by Jpsy

As said before, CLI scripts by default have no time limit.

如前所述,默认情况下 CLI 脚本没有时间限制。

But I would also like to mention an alternative to your cron job approach:
You can fork a CLI PHP script from a PHP script under webserver control. I have done this many times. It is especially useful if you have a script with long execution time which must be triggered by some website user action (e.g. building a very large archive file and send a download link by email when the file is complete). I usually fork a CLI script from a webserver PHP script using the popen() function. This allows to nicely transfer parameters to the new script instance like this:

但我还想提一下您的 cron 作业方法的替代方法:
您可以从 Web 服务器控制下的 PHP 脚本派生出 CLI PHP 脚本。我已经这样做了很多次。如果您的脚本执行时间很长并且必须由某些网站用户操作触发(例如,构建一个非常大的存档文件并在文件完成时通过电子邮件发送下载链接),那么它尤其有用。我通常使用 popen() 函数从网络服务器 PHP 脚本派生一个 CLI 脚本。这允许很好地将参数传输到新的脚本实例,如下所示:

$bgproc = popen('php "/my/path/my-bckgrnd-proc.php"', 'w');
if($bgproc===false){
  die('Could not open bgrnd process');
}else{
  // send params through stdin pipe to bgrnd process:
  $p1 = serialize($param1);
  $p2 = serialize($param2);
  $p3 = serialize($param3);
  fwrite($bgproc, $p1 . "\n" . $p2 . "\n" . $p3 . "\n");
  pclose($bgproc);
}

In the CLI script you would receive these params like this...

在 CLI 脚本中,您会像这样收到这些参数...

$fp = fopen('php://stdin', 'r');
$param1 = unserialize(fgets($fp));
$param2 = unserialize(fgets($fp));
$param3 = unserialize(fgets($fp));
fclose($fp);

...and do anything with them that would take to long under webserver control.

...并在网络服务器控制下对它们做任何需要很长时间的事情。

This technique works equally well in *nix and Windows environments.

这种技术在 *nix 和 Windows 环境中同样有效。

回答by Green Black

No there are no time limits in php itself when executing php from the command line.

从命令行执行 php 时,php 本身没有时间限制。

But there can be other timeouts, like connections to mysql. So if you have a mysql connection in your code, make sure to keep it alive or set your mysql timeout to something high enough to run your code. Another thing: I've seen some webhosting providers killing php apps running more then a few minutes. So make sure your provider does not do that.

但是可能还有其他超时,例如与 mysql 的连接。因此,如果您的代码中有 mysql 连接,请确保使其保持活动状态或将 mysql 超时设置为足够高的值以运行您的代码。另一件事:我看到一些虚拟主机提供商杀死了运行超过几分钟的 php 应用程序。因此,请确保您的提供商不会这样做。

回答by Kishor

As default, PHP scripts timesout after 30 seconds which can be overridden by editing the PHP.ini or by adding this at the top of your script.

默认情况下,PHP 脚本会在 30 秒后超时,这可以通过编辑 PHP.ini 或将其添加到脚本顶部来覆盖。

set_time_limit(0);

This sets unlimited execution time to your script, that is, it never ends unless the scripts finish execution, or the server goes down, or the file is deleted or any fatal error comes.

这为您的脚本设置了无限的执行时间,也就是说,除非脚本完成执行,或者服务器出现故障,或者文件被删除或出现任何致命错误,否则它永远不会结束。

Additionally,

此外,

You can add this to your script and open it in your browser to initiate the script, and it will run as if you are opening it in a browser and keeping the browser open.

您可以将它添加到您的脚本中并在您的浏览器中打开它以启动脚本,它会像您在浏览器中打开它并保持浏览器打开一样运行。

ignore_user_abort();

It simply runs the script in background. These both would be useful for you.

它只是在后台运行脚本。这两个都会对你有用。

ADD : When the scripts are run from the commandline,Cli, the default timeout is 0.(No Timeout)

添加:当脚本从命令行运行时,Cli,默认超时为 0。(无超时)