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

Joe*_*nks 14 php cron

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

Jps*_*psy 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);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


Gre*_*ack 5

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

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