如何在没有php脚本中断的情况下执行外部程序

时间:2012-01-19 06:09:32

标签: php shell

例如:

//test.php
#! /usr/local/php/bin/php
<?php
exec('nohup ./loop.php > loop.out');
echo 'I am a superman!';

//loop.php
#! /usr/local/php/bin/php
<?php
$count = 0;
while (true) {
    echo "Loop count:{$count}\n";
    $count++;
}

当我运行./test.php时我无法得到输出'我是超人!',因为你知道loop.php是一个无限循环,test.php被loop.php打断,所以我怎么能得到输出?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

有很多方法可以实现这一目标:

使用&运行后台流程:

exec('nohup ./loop.php > loop.out 2>&1 &');

使用pcntl_fork并从子级运行您的进程:

 $pid = pcntl_fork();
 switch ($pid){
   case -1:
     die('Fork failed');
     break;
   case 0:
     exec('nohup ./loop.php > loop.out');
     exit();
   default:
     break;
 }
 echo "I'm not really a superman, just a parent process';

有更多方法可以做到这一点,只是潜入PHP文档和中的问题......

答案 1 :(得分:2)

要在PHP中执行异步处理,您可能希望使用Gearmanbeanstalkd

之类的内容

答案 2 :(得分:0)

让一个“永无止境”的循环运行永远不是一个好主意。如果您需要经常运行特定任务,请考虑使用服务器操作系统提供的Cron作业,而不是实际上是PHP的一部分。

此外,如果您的PHP代码的一部分需要大量时间来执行,那么您应该更改您的设计方法以将作业排入数据库并让外部Job Scheduler处理它。

查看this帖子了解更多详情。