如何从PHP脚本调用另一个PHP脚本?

时间:2010-03-22 06:34:04

标签: php

我有一个PHP脚本,运行时间为34秒。但它在30秒后死亡。我想我的webhost的时间限制为30秒。

我正在考虑将脚本分成两部分,比如PHP-1和PHP-2。

我可以从PHP-1调用PHP-2并杀死PHP-1吗? 两个脚本都必须按顺序运行,因此无法使用cron调用它们。 [我的主机提供间隔5分钟的cron,不允许更改开始时间]

- 这会绕过主持人设定的时限吗?

3 个答案:

答案 0 :(得分:4)

你应该使用set_time_limit()功能,它在大多数情况下都有帮助。

或者,在Linux / Unix上,您可以尝试将脚本作为后台进程运行。 PHP CLI可用于此目的,通过CLI运行的脚本没有时间限制。您可以使用exec/system或类似的PHP函数来启动PHP CLI并让它在后台运行PHP脚本,立即将控制权返回给脚本。在大多数情况下,通过CLI运行的PHP脚本的行为就像在CGI环境中一样,除了很少的环境相关差异,例如没有时间限制。

这是一种方法:

exec("/usr/bin/php script.php > /dev/null &");
      ^            ^          ^           ^
      |            |          |           |
      |            |          |           +-- run the specified process in background
      |            |          +-------------- redirect script output to nothing
      |            +------------------------- your time consuming script
      +-------------------------------------- path to PHP CLI (not PHP CGI)

更多详情请见:Running a Background Process in PHP

答案 1 :(得分:1)

查看set_time_limit()

答案 2 :(得分:0)

将其作为CLI运行将自动消除时间限制。你可以使用cron,如Salman A.所描述的那样。 我有每30分钟运行一次的脚本。它确实如此:

<?php
$timeLimit = 1740; //29 mins 
$startTime = time();

do 
{
   $dhandle = opendir("/some/dir/to/process");
   while ( (false !== ($file = readdir($dhandle))) ) {
      //do process.
   }
   sleep(30);
} while (!IsShouldStop($startTime, $timeLimit));



function IsShouldStop($startTime, $timeLimit)
{
   $now = time();
   $min = intval(date("i"));
   if ( ($now > $startTime + $timeLimit) && ($min >= 29 || $min >= 59) )
   {
      echo "STOPPING...<br />\n";
      return true;
   }
   else
   {
      return false;
   }
}

?>

为什么我这样做?因为我读过PHP在垃圾收集方面非常糟糕的地方。所以我每隔30分钟杀掉它。 它并不那么健壮。但是,考虑到共享托管的约束。这是我最好的方法。 您可以将其用作模板。