1

Linux システムのログファイルを分析する小さなデーモンを PHP で構築しようとしています。(例:syslogをたどる)。

でファイルを開き、fopen継続的に読み取ることができましたstream_get_line。私の問題は、監視対象のファイルが削除されて再作成されたときに始まります (たとえば、ログをローテーションするとき)。その後、ファイルが以前よりも大きくなったとしても、プログラムは何も読み取らなくなります。

これに対するエレガントな解決策はありますか? コマンドラインstream_get_meta_dataで使用しても同じ問題が発生します。tail -f

編集、サンプルコードを追加 探しているものを説明するためにコードを最小限に要約しようとしました

<?php
$break=FALSE;
$handle = fopen('./testlog.txt', 'r');
do {
    $line = stream_get_line($handle, 100, "\n");
    if(!empty($line)) {
        // do something
        echo $line;
    }
    while (feof($handle)) {
      sleep (5);
      $line = stream_get_line($handle, 100, "\n");
      if(!empty($line)) {
        // do something
        echo $line;
      }
      // a commented on php.net indicated it is possible
      // with tcp streams to distinguish empty and lost
      // does NOT work here  --> need somefunction($handle)
      if($line !== FALSE && $line ='') $break=TRUE;
    }
} while (!$break);
fclose($handle);
?>
4

1 に答える 1

2

ログ ファイルがローテーションされると、元のファイルがコピーされてから削除され、同じ名前の新しいファイルが作成されます。元のファイルと同じ名前である可能性がありますが、i ノードが異なります。inode (以下の説明は省略) は、ファイルの隠し増分インデックス番号のようなものです。ファイルの名前を変更したり、移動したりできますが、i ノードが一緒に取り込まれます。元のログ ファイルが削除されると、inode が変更されているため、同じファイル ハンドラを使用して同じ名前のファイルを再度開くことはできません。あなたの最善の策は、失敗を検出し、新しいファイルを開こうとすることです。

于 2012-05-24T16:56:47.200 に答える