【问题标题】:Reading STDOUT from aria2c in PHP script在 PHP 脚本中从 aria2c 读取 STDOUT
【发布时间】:2013-12-21 20:38:33
【问题描述】:

这是简单的 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。

<...>

[#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 工作正常。

【问题讨论】:

  • 你找到解决这个问题的方法了吗?
  • 不。使用了其他软件。

标签: php proc-open aria2


【解决方案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

【讨论】:

    猜你喜欢
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    相关资源
    最近更新 更多