2

クライアントの IP アドレスをログに記録するために使用しているファイルがあります。彼らは、ファイルの最後の 500 行を保持したいと考えています。これは、PHP4 を使用した Linux システム上にあります (いや!)。

一度に 1 行ずつ新しい IP アドレスをファイルに追加するつもりでした。cron にアクセスできないので、おそらくこの関数で行制限のクリーンアップも行う必要があります。

likeを使用するかexec('tail [some params]')、PHPでファイルを読み取り、改行で配列に展開し、最後の1000要素を取得して、書き戻すことを考えていました。ただし、メモリ集約型のようです。

これを行うためのより良い方法は何ですか?

アップデート:

以下の @meagar のコメントによると、zip 機能を使用したい場合、PHP スクリプト内でそれを行うにはどうすればよいですか? (cron へのアクセスなし)

if(ランド(0,10) == 10){
 shell_exec("find .logfile.txt [ここでサイズ > 1MB] -exec zip {} \;")
}

既存のファイルがある場合、zip はファイルを自動的に列挙しますか、それとも手動で行う必要がありますか?

4

3 に答える 3

2

ログ回転

これは「適切な」答えであり、これを設定することも難しくありません。

于 2011-06-14T15:59:27.513 に答える
2

おそらく最速の方法は、あなたが提案したように、テールを使用することです:

passthru("tail -n 500 $filename");

(passthru は exec と同じことを行いますが、プログラム出力全体を stdout に出力するだけです。出力バッファーを使用して出力をキャプチャできます)

[編集]

ログローテーションの方がはるかに優れているという以前のコメントに同意します...しかし、cronにアクセスできないと述べたので、ログローテートもできないと思います。

于 2011-06-14T15:55:05.143 に答える
0

count(explode("\n", file_get_contents("log.txt"))) を使用して行数を取得できます。それが 1000 に等しい場合は、最初の \n から最後までの部分文字列を取得し、新しい IP アドレスを取得し、ファイル全体を再度書き込みます。ファイルを a+ モードで開いて新しい IP を書き込むのとほとんど同じです。

于 2011-06-14T15:58:02.790 に答える