在PHP脚本中从aria2c读取STDOUT

时间:2013-12-21 20:38:34

标签: php proc-open aria2

这是一个简单的PHP脚本:

<?php
is_resource($process = proc_open('aria2c http://speedtest.rinet.ru/file100m.dat',  [
   ['pipe', 'r'],
   ['pipe', 'w'],
   ['file', '/tmp/error-output.txt', 'a']
], $pipes, '/tmp', [])) || die();
fclose($pipes[0]);
fpassthru($pipes[1]);
fclose($pipes[1]);
proc_close($process);

问题是输出中的进度数据“停滞”直到aria2c完成。当aria2c进程结束时,它立即将所有输出突发到我的脚本。它与fpassthru()无关,我尝试了相同结果的普通fread()。

流程:

  

[注意]文件已存在。重命名为/tmp/file100m.dat.4。

     

&lt; ...巨大的延迟然后爆发......&gt;

     

[#edb1dc 70MiB / 100MiB(70%)CN:1 DL:8.4MiB ETA:3s]

     

[#edb1dc 81MiB / 100MiB(81%)CN:1 DL:9.7MiB ETA:1s]

     

[#edb1dc 92MiB / 100MiB(92%)CN:1 DL:10MiB]

我需要得到像“[#edb1dc 92MiB / 100MiB(92%)CN:1 DL:10MiB]”这样的行,而不必等待aria2c结束以收集有关当前进度的信息。

更不用说,如果我在控制台中运行完全相同的命令,aria2c工作正常。

1 个答案:

答案 0 :(得分:1)

我试图从PHP监控Aria2下载进度(读出)时遇到了同样的问题。

问题是由于Aria2代码中缺少fflush(stdout)引起的,但幸运的是,您可以在PHP代码中使用修复来重新配置STDOUT缓冲模式。您可以使用Linux下的stdbuf实用程序或OSX下的unbuffer实用程序来禁用缓冲,如下所示:

proc_open('stdbuf -o0 aria2c ...'); // on Linux

或:

proc_open('unbuffer aria2c ...'); // on OSX

(感谢@ hek2mgl关于另一个类似问题的answer