関数はここfpassthru
では機能しません。さらに、ファイルがいつ完成するかを知るという問題が発生します。
ファイルの最後に達すると、ファイルの読み取り関数は停止します。ファイルの長さを増やしている並行ライターが存在する場合、EOF が表示される前にリーダーがどこまで到達するかは不確定です。さらに、ファイル ライタが完了したかどうかをファイル操作を通じて知る明確な方法はありません。
次のようなループ (疑似コード) を使用して、タイムアウトで読み取りを試行することが実行可能である可能性があります。
LOOP
READ bytes
IF count read == 0
THEN
SLEEP briefly
INCREMENT idle_count
ELSE
SET idle_count = 0
WRITE
END IF
UNTIL ( idle_count == 10 )
役立つ場合は、それを PHP コードに入れることができます。
in.dat
2 つのファイルでこれを行う PHP コードを次に示しますout.dat
。
<?php
$in_fp = fopen("./in.dat", "r");
$out_fp = fopen("./out.dat", "w");
$idle_count = 0;
while ( $idle_count < 10 )
{
if ( $idle_count > 0 )
sleep(1);
$val = fread($in_fp, 4192);
if ( ! $val )
{
$idle_count++;
}
else
{
$idle_count = 0;
$rc = fwrite($out_fp, $val);
if ( $rc != strlen($val) )
die("error on writing of the output file\n");
}
}
スリープの奇妙な位置は、最後に読み取りを試みてから 1 秒後にスリープしないようにするためであることに注意してください。
この目的のために、アイドル タイムアウト制限を 10 よりも高く設定することをお勧めします。