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

2022-01-03 00:00:00 cron php

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

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.

推荐答案

如前所述,CLI 脚本默认没有时间限制.

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

但我还想提一下您的 cron 作业方法的替代方法:
您可以从 Web 服务器控制下的 PHP 脚本派生出 CLI PHP 脚本.我已经这样做了很多次.如果您的脚本执行时间长且必须由某些网站用户操作触发(例如,构建一个非常大的存档文件并在文件完成时通过电子邮件发送下载链接),则此功能特别有用.我通常使用 popen() 函数从网络服务器 PHP 脚本派生一个 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:

$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 . "
" . $p2 . "
" . $p3 . "
");
  pclose($bgproc);
}

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

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

$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.

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

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

相关文章