簡単な 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 は正常に動作します。