php 执行后台进程

php
2022-08-30 06:06:27

我需要在用户操作时执行目录复制,但是目录非常大,因此我希望能够在用户不知道完成复制所需的时间的情况下执行此类操作。

任何建议将不胜感激。


答案 1

假设这是在Linux机器上运行的,我总是这样处理它:

exec(sprintf("%s > %s 2>&1 & echo $! >> %s", $cmd, $outputfile, $pidfile));

这将启动命令 ,将命令输出重定向到 ,并将进程 ID 写入 。$cmd$outputfile$pidfile

这使您可以轻松监视进程正在执行的操作以及它是否仍在运行。

function isRunning($pid){
    try{
        $result = shell_exec(sprintf("ps %d", $pid));
        if( count(preg_split("/\n/", $result)) > 2){
            return true;
        }
    }catch(Exception $e){}

    return false;
}

答案 2

用任何方便的语言(php/bash/perl/etc)将进程编写为服务器端脚本,然后从php脚本中的进程控制函数调用它。

该函数可能会检测标准 io 是否用作输出流,如果是,则将设置返回值。如果不是,则结束

proc_close( proc_open( "./command --foo=1 &", array(), $foo ) );

我从命令行使用“sleep 25s”作为命令快速测试了这一点,它就像一个魅力。

(答案在这里找到)


推荐