【问题标题】:PHP shell_exec update output as script is runningPHP shell_exec 在脚本运行时更新输出
【发布时间】:2013-12-16 15:30:35
【问题描述】:

我正在使用脚本从我的服务器获取文件。我正在使用 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();

谢谢

【问题讨论】:

    标签: php shell-exec


    【解决方案1】:

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

    您的下载工具会在末尾使用\r 字符刷新进度,这会覆盖实际行,因为没有后续\n 换行字符。

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

    请参考这些函数在 php.net 或 google 上查找代码示例。

    【讨论】:

      【解决方案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 环境路径中...为了安全起见,您应该在系统上指定它的完整路径...

      【讨论】:

      • 警告:feof() 期望参数 1 为资源,在第 9 行的 /var/www2/html/download.php 中给出 null 警告:stream_select():提供的参数不是有效的流资源在第 11 行的 /var/www2/html/download.php 中警告:stream_select() [function.stream-select]:第 11 行的 /var/www2/html/download.php 中没有传递流数组警告:fread( ) 期望参数 1 是资源,在第 13 行的 /var/www2/html/download.php 中给出 null
      • 似乎仍然出现相同的错误,我尝试用 wget 替换 aria2c 和相同的错误。我实际上不确定 aria2c 是否可以通过 php 环境路径执行,当我使用 shell_exec 时它运行良好,这是否意味着它可以?感谢您的帮助,非常感谢。
      • 好的。不适合我...请注意我现在从 $pipes[2] 读取,因为 wget 写入 stderr...
      • 好的,谢谢,它似乎可以与 wget 一起使用,但无法让 aria2 正常工作,我需要更改 $pipes[2] 吗?
      猜你喜欢
      • 2015-05-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-13
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多