17

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

4

3 回答 3

30

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

但我还想提一下您的 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);
}

在 CLI 脚本中,您将收到这些参数,如下所示...

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

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

这种技术在 *nix 和 Windows 环境中同样适用。

于 2012-11-12T22:34:32.493 回答
5

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

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

于 2012-11-12T22:15:04.090 回答
3

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

set_time_limit(0);

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

此外,

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

ignore_user_abort();

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

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

于 2012-11-12T22:16:27.240 回答