当shell脚本运行时,PHP shell_exec更新输出

时间:2013-12-16 15:30:35

标签: php shell-exec

我正在使用脚本从我的服务器获取文件。我正在使用aria2快速下载文件并且它运行良好但是有一种方法可以在脚本运行时输出命令中发生的事情。

例如,当您通过命令行运行此命令时,您每隔几秒就会获得更新

$output = shell_exec('aria2c http://myserver.com/myfile.rar');
echo "<pre>$output</pre>";

我得到了这些输出:

[#f6a7c4 9.5MiB/1.7GiB(0%) CN:15 SD:5 DL:431KiB ETA:1h9m9s]

[#f6a7c4 52MiB/1.7GiB(2%) CN:23 SD:7 DL:0.9MiB ETA:30m19s]

[#f6a7c4 141MiB/1.7GiB(8%) CN:26 SD:4 DL:1.7MiB ETA:15m34s]

脚本只有在完成执行后才会显示这些数据,这可能会超过5分钟以上,所以我想知道最新情况是怎么回事?

我尝试添加以下内容:

ob_start();
--Get URL for Files and show URL on screen
ob_flush();
--Start downloading file
ob_flush();

由于

2 个答案:

答案 0 :(得分:2)

您需要打开一个流程描述符句柄,以便与proc_open()异步读取,并使用stream_get_contents()从此流中读取。

您下载的工具会在最后用\r字符清除进度,这会覆盖实际行,因为没有以下\n换行符。

http://www.php.net/manual/en/function.proc-open.php

请参阅这些函数以查找php.net或google上的代码示例。

答案 1 :(得分:2)

您最好使用proc_open,而不是shell_exec() ...:

<?php
    $cmd = 'wget http://192.168.10.30/p/myfile.rar';
    $pipes = array();
    $descriptors = array(
        0 => array("pipe", "r"),
        1 => array("pipe", "w"),
        2 => array("pipe", "w"),
    );
    $process = proc_open($cmd, $descriptors, $pipes) or die("Can't open process $cmd!");

    $output = "";
    while (!feof($pipes[2])) {
        $read = array($pipes[2]);
        stream_select($read, $write = NULL, $except = NULL, 0);
        if (!empty($read)) {
            $output .= fgets($pipes[2]);
        }
        # HERE PARSE $output TO UPDATE DOWNLOAD STATUS...
        print $output;
    }
    fclose($pipes[0]);
    fclose($pipes[1]);
    fclose($pipes[2]);
    proc_close($process);
    ?>

更新:是的,抱歉,纠正了几个错误...: - (

并且,确保“aria2”可执行文件在您的php环境中路径...为了安全起见,您应该在系统上指定它的完整路径......