16

PHPでtailコマンドなどの動きをしたいのですが、どうやってファイルに追加するのを見ることができますか?

4

6 に答える 6

24

魔法のような方法があるとは思えません。ファイルサイズを継続的にポーリングし、新しいデータを出力するだけです。これは実際には非常に簡単で、実際に注意する必要があるのは、ファイル サイズやその他の統計データが php にキャッシュされることだけです。clearstatcache()これに対する解決策は、データを出力する前に呼び出すことです。

エラー処理を含まない簡単なサンプルを次に示します。

function follow($file)
{
    $size = 0;
    while (true) {
        clearstatcache();
        $currentSize = filesize($file);
        if ($size == $currentSize) {
            usleep(100);
            continue;
        }

        $fh = fopen($file, "r");
        fseek($fh, $size);

        while ($d = fgets($fh)) {
            echo $d;
        }

        fclose($fh);
        $size = $currentSize;
    }
}

follow("file.txt");
于 2009-07-09T07:27:53.963 に答える
11
$handle = popen("tail -f /var/log/your_file.log 2>&1", 'r');
while(!feof($handle)) {
    $buffer = fgets($handle);
    echo "$buffer\n";
    flush();
}
pclose($handle);
于 2013-01-04T20:31:05.967 に答える
5

Google コードで php-tail をチェックアウトします。これは PHP と Javascript を使用した 2 つのファイルの実装であり、私のテストではオーバーヘッドがほとんどありません。

grep キーワードによるフィルタリングもサポートしています (フレームレートなどを毎秒吐き出す ffmpeg に役立ちます)。

于 2012-12-11T12:52:54.193 に答える
2
$handler = fopen('somefile.txt', 'r');

// move you at the end of file
fseek($handler, filesize( ));
// move you at the begining of file
fseek($handler, 0);

おそらく、 stream_get_lineの使用を検討したいと思うでしょう。

于 2009-07-09T07:17:12.300 に答える
2

ファイルサイズをポーリングする代わりに、ファイルの変更時刻を定期的にチェックします: filemtime

于 2009-07-09T09:31:17.413 に答える