php执行后台进程

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

任何建议将不胜感激。


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

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

这将启动命令$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;
}

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

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

Proc_Close (Proc_Open ("./command --foo=1 &", Array (), $foo));

我使用“sleep 25s”作为命令在命令行中快速测试了它,并且它像一个魅力一样工作。

(在这里找到答案)


我只想添加一个非常简单的例子来在Windows上测试这个功能:

创建以下两个文件并将其保存到Web目录中:

foreground.php:

<?php

ini_set("display_errors",1);
error_reporting(E_ALL);

echo "<pre>loading page</pre>";

function run_background_process()
{
    file_put_contents("testprocesses.php","foreground start time = " . time() . "n");
    echo "<pre>  foreground start time = " . time() . "</pre>";

    // output from the command must be redirected to a file or another output stream 
    // http://ca.php.net/manual/en/function.exec.php

    exec("php background.php > testoutput.php 2>&1 & echo $!", $output);

    echo "<pre>  foreground end time = " . time() . "</pre>";
    file_put_contents("testprocesses.php","foreground end time = " . time() . "n", FILE_APPEND);
    return $output;
}

echo "<pre>calling run_background_process</pre>";

$output = run_background_process();

echo "<pre>output = "; print_r($output); echo "</pre>";
echo "<pre>end of page</pre>";
?>

background.php:

<?
file_put_contents("testprocesses.php","background start time = " . time() . "n", FILE_APPEND);
sleep(10);
file_put_contents("testprocesses.php","background end time = " . time() . "n", FILE_APPEND);
?>

授予IUSR权限以写入您创建上述文件的目录

将IUSR权限授予READ和EXECUTE C: Windows System32 cmd.exe

从网页浏览器中点击foreground.php

应将以下内容呈现给浏览器,其中包含输出数组中的当前时间戳和本地资源#:

loading page
calling run_background_process
  foreground start time = 1266003600
  foreground end time = 1266003600
output = Array
(
    [0] => 15010
)
end of page

您应该在保存上述文件的同一目录中看到testoutput.php,并且它应该是空的

您应该在保存上述文件的同一目录中看到testprocesses.php,并且它应该包含以下带有当前时间戳的文本:

foreground start time = 1266003600
foreground end time = 1266003600
background start time = 1266003600
background end time = 1266003610
链接地址: http://www.djcxy.com/p/37159.html

上一篇: php execute a background process

下一篇: How do I shutdown