【问题标题】:How can I execute an external program without php script interrupt如何在没有 php 脚本中断的情况下执行外部程序
【发布时间】:2012-01-19 06:09:31
【问题描述】:

例如:

//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 中断,那我该怎么办得到输出?任何帮助表示赞赏。

【问题讨论】:

    标签: php shell


    【解决方案1】:

    有很多方法可以实现:

    使用&amp;运行后台进程:

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

    【讨论】:

      【解决方案2】:

      要在 PHP 中执行异步进程,您需要使用 Gearmanbeanstalkd 之类的东西

      【讨论】:

      • +1 我自己是 beanstalkd 的粉丝,但核心信息是一样的:排队。除此之外,这让您可以轻松控制同时作业的最大数量——不要运行超过您可以处理的队列消费者。
      • 我从没听说过 beanstalkd,它看起来真不错!更新了答案以包含对它的引用
      【解决方案3】:

      运行“永无止境”的循环绝不是一个好主意。如果您需要频繁运行特定任务,请考虑使用 Cron Jobs,它由服务器操作系统提供,实际上并不是 PHP 的一部分。

      此外,如果您的 PHP 代码的一部分需要大量时间来执行,您应该更改设计方法,将作业排队到数据库中,并让外部作业调度程序处理它。

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

      【讨论】:

      • Cron 作业应该是一种经常处理任务的好方法,但我只想运行一个外部程序而不等待它完成。另外,我想通过php脚本逻辑启动外部程序而不是固定频率的任务。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2017-04-03
      • 2011-03-04
      相关资源
      最近更新 更多