代码之家  ›  专栏  ›  技术社区  ›  Jagira

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

php
  •  0
  • Jagira  · 技术社区  · 14 年前

    我有一个运行时间为34秒的PHP脚本。但30秒后死亡。我想我的网络主机的时间限制是30秒。

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

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

    -这会绕过主机设置的时间限制吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Salman Arshad    14 年前

    你应该使用 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

        2
  •  1
  •   Steve-o    14 年前
        3
  •  0
  •   ariefbayu    14 年前

    将其作为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分钟杀一次它。 它没有那么健壮。但是,考虑到共享托管的限制。这是我最好的方法。 您可以将其用作模板。