質問 > 管理機能 > ログローテーション処理について |
管理機能
フラット表示 | 前のトピック | 次のトピック |
投稿者 | スレッド |
---|---|
patapata |
投稿日時: 2010/9/21 23:00
対応状況: −−−
|
仙人 登録日: 2010/7/7 居住地: 神奈川県 投稿: 502 |
Re: ログローテーション処理について お返事が遅くなりまして申し訳ありません。
seasoft様、AMUMU様たくさんの情報どうもありがとうございます。 以下について >昨日お書きいただいたコードでしたら、clearstatcache() を直前で呼んでいますので、キャッシュの影響は無いような気がします。 すみません。説明が足りてませんでした。上記は、改版前で起きていた現象です。 板の一番最初に書きました。以下のことがらについての自己レスとなります。 >>rename処理が何重にも走っているようです。 にかかってきており、該当の処理はrenameとは別で、filesizeのキャッシュの問題になりますので、それはPHPのVerに関係なく 修正されていないかもと思い、あげさせていただきました。(調べてみた限りでは、修正されている節はありませんでした。) filesize関数のキャッシュのみ効いている場合は、エラーは起きませんが、MAXSizeに到達しない場合でも、 ログローテーション処理が連続して発生するかと思われます。 以下について >・realpath_cache_size >・realpath_cache_ttl 上記設定を0に設定のみの修正で試してみたところ、ワーニングは発生しませんでしたが、 filesizeでキャッシュを読み込んでいるのか・・・ログローテーション処理が発生しまくり、MAXに達していないファイルが 多数できあがりました。 以下について >if ( !file_exists($path) || filesize($path) <= $max_size) return; !file_exists($path)を入れないと、いくらキャッシュをクリアしてもワーニングが発生するようです。 おそらく書き込みでどっかしっぱいしてるのだと思われますが・・・ もう時間がないので放置です。ごめんなさい。 最終的に以下のようになりました。 ---------------------------------------------------------- function gfLogRotation($max_log, $max_size, $path) { // ファイルが最大サイズを超えていない場合、終了 clearstatcache(); if ( !file_exists($path) || filesize($path) <= $max_size) return; // アーカイブのインクリメント(削除を兼ねる) for ($i = $max_log; $i >= 2; $i--) { $path_old = "$path." . ($i - 1); $path_new = "$path.$i"; clearstatcache(); if (file_exists($path_old)) { clearstatcache(); rename($path_old, $path_new); clearstatcache(); } } // 現在ファイルのアーカイブ clearstatcache(); rename($path, "$path.1"); clearstatcache(); } ---------------------------------------------------------- (私はこんな風にしちゃいましたが、最後にファイル作った方が安全かもしれません・・・) その他 chroot(), clearstatcache(), rename(), rmdir(), unlink()を呼び出したタイミングで、realpath cacheはクリアされる とかってらしいですね。まぁVerによって大分動作が違うみたいなので、正確かどうかはわかんないですけど。 しかしfilesizeは、やはり見当たらないので、もしかしたら皆さんの環境でもファイルサイズがおかしなログが作成されているかもしれません。 以上です。どうもありがとうございました。 |
フラット表示 | 前のトピック | 次のトピック |