2

簡単な 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]

現在の進行状況に関する情報を収集するために aria2c が終了するのを待たずに、「[#edb1dc 92MiB/100MiB(92%) CN:1 DL:10MiB]」のような行を取得する必要があります。

言うまでもなく、コンソールでまったく同じコマンドを実行すると、aria2c は正常に動作します。

4

1 に答える 1

1

PHP から Aria2 のダウンロードの進行状況 (読み取り) を監視しようとしているときに、同じ問題に遭遇しました。

この問題はfflush(stdout)、Aria2 コードの欠落が原因で発生しますが、幸いなことに、PHP コードで使用して STDOUT バッファリング モードを再構成できる修正があります。stdbufLinux のユーティリティまたはunbufferOSX のユーティリティを使用して、次のようにバッファリングを無効にすることができます。

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

また:

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

(別の同様の質問に対するこの回答については、@ hek2mglに感謝します)

于 2014-06-30T16:00:21.653 に答える