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

时间:2012-11-12 22:07:42

标签: php cron

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

3 个答案:

答案 0 :(得分:24)

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

但我还想提一下你的cron工作方法的替代方案:
您可以在Web服务器控件下从PHP脚本派生CLI PHP脚本。我做了很多次。如果您的脚本具有较长的执行时间,必须由某些网站用户操作触发(例如,构建一个非常大的存档文件并在文件完成时通过电子邮件发送下载链接),这将非常有用。 我通常使用popen()函数从Web服务器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);
}

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

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

...并且在网络服务器控制下花费很长时间做任何事情。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

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

set_time_limit(0);

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

此外,

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

ignore_user_abort();

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

ADD:从命令行Cli运行脚本时,默认超时为0.(无超时)