2012-11-12 90 views
14

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

+1

检查[参数或者set_time_limit(http://php.net/manual/en/function.set-time-limit.php) – Vatev

+1

CLI称为PHP脚本没有时间限制。但共享主机可能会停止需要超过X秒的进程 - 这将如何托管? – 2012-11-12 22:11:20

+0

请参阅:http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time,CLI中没有时间限制 –

回答

24

正如之前所说,CLI脚本在默认情况下没有时间限制。

但我也想提一个替代你的cron作业方式:
您可以从网络服务器控制下的PHP脚本fork一个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脚本,你会收到这些PARAMS这样的...

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

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

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

+0

非常有帮助,谢谢Jpsy。 –

4

否有来自命令行执行的PHP时是在PHP本身没有时间限制。

但可以有其他超时,喜欢的MySQL连接。因此,如果您的代码中有一个mysql连接,请确保将其保持为活动状态,或将您的mysql超时设置为足够高以运行您的代码。另一件事:我见过一些webhosting提供程序杀死运行多分钟的php应用程序。所以请确保你的提供者不这样做。

3

由于默认情况下,PHP脚本30秒可以通过编辑php.ini中或在你的脚本的顶部添加此重写后timesout。

set_time_limit(0); 

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

此外,

您可以添加到您的脚本,并在浏览器中打开它来启动脚本,因为如果你在浏览器中打开它,并保持浏览器中打开它将会运行。

ignore_user_abort(); 

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

地址:当脚本从命令行运行,CLI,默认的超时值为0(无超时)

+4

错误,cli脚本的默认值为0。 http://www.php.net/manual/en/features.commandline.differences.php – 2012-11-12 22:16:58

+0

好的,点了。据我所知,什么有30秒默认超时呢? – Kishor

+2

“不是命令行”的默认值为30.“这设置脚本在解析器终止前允许运行的最长时间(以秒为单位),这有助于防止编写不当的脚本占用服务器。是30.从命令行运行PHP的默认设置是0.“http://www.php.net/manual/en/info.configuration.php#ini.max-input-time – 2012-11-12 22:20:03