2013-12-21 30 views
2

下面是簡單的PHP腳本:閱讀STDOUT從PHP腳本aria2c

<?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:3秒]

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

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

我需要得到狀的線「[#edb1dc 92MiB/100MiB(92%)CN:1 DL:10MiB]」,無需等待aria2c結束收集信息a回合目前的進展。

更何況,如果我在控制檯運行完全相同的命令aria2c工作正常。

+0

您是否找到了解決此問題的解決方案? –

+0

沒有。使用另一個軟件。 – user2848443

回答

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另一個類似的問題)