ホームページ >バックエンド開発 >PHPチュートリアル >PHP は Linux コマンド tail -f を実装します

PHP は Linux コマンド tail -f を実装します

WBOY
WBOYオリジナル
2016-06-20 12:36:50914ブラウズ

PHP は Linux コマンド tail -f を実装します

今日、以前誰かから尋ねられた質問を突然思い出しました。PHP で Linux コマンド tail -f を実装する方法について分析してみましょう。ここで実装します。

これは、考えてみれば非常に単純です。ファイルのサイズが変更されたかどうかを確認するために、ファイルの変更された部分が出力されます。 、その中には詳細な分析がたくさんあります。

初期ファイルが大きすぎる場合、または内容を変更しすぎた場合

このとき、一度に大量の内容が出力され、見づらくなる可能性があるため、ここでは、コンテンツの長さがこのしきい値 8192 を超えた場合、最後の 8192 バイトのみが出力されるため、広い領域のリフレッシュによる視認性の問題は発生しません。

ファイルサイズの変化を検出する方法

この質問がこのプログラムの核心であり、成功するかどうかはこの部分に依存します。ここでの実装は次のとおりです。

  • ファイル ハンドル $fp を開きます。ここで注意すべき点は、ファイル ハンドルはプロセス全体で 1 回だけ開いたり閉じたりする必要があるためです。ループの外側に配置されます。
  • 現在のファイル サイズ file_size と file_size_new を両方とも 0 に初期化します。
    • ループ内で file_size_new ファイル サイズを更新します。PHP でファイル サイズを取得する前に、clearstatcache() 関数を実行してファイル ステータス キャッシュをクリアする必要があることに注意してください。そうしないと、ファイル ステータスの取得に誤差が生じる可能性があります。ファイルサイズ。
    • add_size = file_size_new - file_size を計算して、ファイル サイズが変更されるかどうかを確認し、変更がある場合は、ファイル ポインターを指定した位置に移動し、新しく追加された内容を出力し、file_size の値を new_file_size に更新します。
    • usleep(50000)、1/20 秒スリープします。

コード実装

#!/usr/bin/env php <?phpif(2 != count($argv)){    fwrite(        STDERR,        "调用格式错误!使用格式 ./tail filename".PHP_EOL    );      return 1;}$file_name      = $argv[1];define("MAX_SHOW", 8192);$file_size      = 0;$file_size_new  = 0;$add_size       = 0;$ignore_size    = 0;$fp = fopen($file_name, "r");while(1){    clearstatcache();    $file_size_new  = filesize($file_name);    $add_size       = $file_size_new - $file_size;    if($add_size > 0){         if($add_size > MAX_SHOW){            $ignore_size    = $add_size - MAX_SHOW;            $add_size       = MAX_SHOW;            fseek($fp, $file_size + $ignore_size);        }           fwrite(            STDOUT,            fread($fp, $add_size)        );          $file_size  = $file_size_new;    }    usleep(50000);}fclose($fp);

コード実装 ここでの #!/usr/bin/env php の最初の行は、実行可能ファイル、実行可能ファイルを示します。 php はシステム PATH で検索されるため、移植性が高いという利点があります。

2016-02-22 11:28:51 改善

PHP 公式マニュアルを確認しました。fseek 関数はここで改善できます。この関数は 3 番目のパラメーターも受け入れます、オフセット ポインターのタイプを示します。デフォルトは SEEK_SET (先頭からのオフセット) ですが、現在位置からのオフセットを示す SEEK_CUR に設定することもできるため、ここでは fseek($fp, $ignore_size, $ignore_size) に変更されます。 ;

結果は次のとおりです

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。