【问题标题】:Perform an action when a process has finished in PHP当一个进程在 PHP 中完成时执行一个动作
【发布时间】:2011-11-07 13:30:50
【问题描述】:

我一直在使用这个函数来检查一个进程是否正在运行。 (我从http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/得到它):

function Is_Process_Running($PID){

exec("ps $PID", $ProcessState); 
return(count($ProcessState) >= 2);  
}

我的理解是,只有当数组 $ProcessState 中有两行以上时,该函数才会返回,如果进程处于活动状态,它将返回。

因此,在进程运行时编写代码来执行操作很容易,如下所示(也来自上面的链接):

while(is_process_running($PID))
   {
     echo(" . ");
       ob_flush(); flush();
            sleep(1);
   }

但是,当流程完成后执行操作的最佳方式是什么?我试过了:

while(! is_process_running($PID))

但这不起作用,我认为因为它只通过循环一次。非常感谢任何帮助,谢谢!

【问题讨论】:

    标签: php process


    【解决方案1】:

    只需将要执行的代码放在循环之后:

    // Process is still running
    while (is_process_running($PID))
    {
      // wait
    }
    
    // Process is no longer running
    do_stuff_afterwards();
    

    如果您首先需要根据进程是否正在运行来进行分支,您可以将整个事情包装在 if (is_process_running($PID)) 条件中。

    【讨论】:

    • 天哪,我真的没想到会这么容易,非常感谢!不过我没有意识到,这会使 php 页面在等待 while 循环时暂停——这对我来说并不理想。必须考虑另一种解决方案,也许将 PID 提供给 bash 脚本或其他东西。干杯!
    • @Jingo:PHP 只是单线程的。如果您需要等待一个事件,您可能需要研究一些基于事件的回调系统。我不熟悉任何顶级的 PHP,但我绝不是专家,而且很有可能存在这样的解决方案。你总是可以问一个关于“异步等待进程在 PHP 中终止”的单独问题......
    【解决方案2】:

    查看 PCNTL 函数 (http://php.net/manual/en/ref.pcntl.php)。根据您的尝试,这个库可能会很有帮助。各个功能页面上有一些代码示例...查看 pcntl_wait();

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2017-02-13
      • 1970-01-01
      • 1970-01-01
      • 2013-01-16
      • 2022-10-17
      • 2016-09-02
      • 1970-01-01
      相关资源
      最近更新 更多