将 php 脚本作为 cron 作业运行 - 超时问题?
我正在编写一个php脚本,该脚本执行一些后端操作,需要每8小时左右运行一次。该脚本需要一段时间才能执行。对于它,我从浏览器中尝试了它,并且在脚本终止之前重置了与服务器的连接。我的问题是 - 如果我直接运行它,即。php -a 文件.php作为 cron 作业,执行上是否存在任何内部时间限制?此脚本可能需要 2-5 分钟才能完成,并且无法中断。我以前从未这样做过,所以我不确定php在运行繁重脚本时是否有怪癖。
我正在编写一个php脚本,该脚本执行一些后端操作,需要每8小时左右运行一次。该脚本需要一段时间才能执行。对于它,我从浏览器中尝试了它,并且在脚本终止之前重置了与服务器的连接。我的问题是 - 如果我直接运行它,即。php -a 文件.php作为 cron 作业,执行上是否存在任何内部时间限制?此脚本可能需要 2-5 分钟才能完成,并且无法中断。我以前从未这样做过,所以我不确定php在运行繁重脚本时是否有怪癖。
如前所述,默认情况下,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);
...并与他们一起做任何在Web服务器控制下需要很长时间的事情。
此技术在 *nix 和 Windows 环境中同样有效。
不,从命令行执行php时,php本身没有时间限制。
但是可能还有其他超时,例如连接到mysql。因此,如果您的代码中有mysql连接,请确保保持其活动状态或将mysql超时设置为足够高以运行代码。另一件事:我见过一些虚拟主机提供商杀死运行超过几分钟的php应用程序。因此,请确保您的提供商不会这样做。