繁体   English   中英

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

[英]How can I execute an external program without php script interrupt

例如:

//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打断,所以我怎么能得到输出? 任何帮助表示赞赏。

您可以通过多种方式实现此目标:

使用&运行后台进程:

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文件和问题这里...

要在PHP中执行异步处理,您可能希望使用Gearmanbeanstalkd之类的东西

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM