アプリ版:「スタンプのみでお礼する」機能のリリースについて

phpでのログファイル自動削除について

以下のような形式でdataフォルダ内にログファイルに日付をつけて
毎日いくつかファイルを保存させているのですが

data/

a_20100914_a.dat
b_20100914_b.dat
c_20100914_c.dat

どんどん蓄積していくために
ある程度日数が経過した古いファイルを自動で削除させたいのですが
(たとえば3日前のものは全部削除など、削除プログラム自体の呼び出しにはcronのwgetを使います)
ファイルが生成された日付で判断させる言う方法もあると思うのですが、
出来ればファイル名で日付を使っているのでそれを利用して出来ないものかと思うのですが
どのように記述すればよいのでしょうか。

削除させるプログラムを置く予定場所はdataフォルダからみて../の位置になります。

お手数をおかけしますがソースをご教授いただけますと幸いですm(__)m

A 回答 (1件)

<?php



//まずベースとなるディレクトリ名を設定します。
//定数「__FILE__」を使うと自分自身のフルパスを返してくれるので、
//自分自身+ログのおいてあるディレクトリをまず設定
$dir = dirname(__FILE__) . DIRECTORY_SEPARATOR . 'data' . DIRECTORY_SEPARATOR;

//スクリプト動作時間から、3日前を設定
//strtotime関数は非常に便利です。
$time = strtotime("-3 day", time());

//glob関数にて、そのディレクトリの中の、特定のファイルを取得し
//foreachでまわす。glob関数はワイルドカードを指定できるので便利
foreach(glob($dir."*.dat") as $data){
//$dataには、ファイルのフルパスが代入されてますので、
//basename関数でファイル名のみを取得しておきます。
$fname = basename($data);

//ファイル名の規則にしたがって、正規表現の後方参照で
//必要箇所を抜き出します。
if(preg_match("/^[^_]+_([0-9]{8})_[^_]+/", $fname, $match)){
//たとえば、「20100910」といった文字であれば、
//strtotime関数は日付として認識してくれますので、
//タイムスタンプに変換。
$ts = strtotime($match[1]);

//先に取得しておいた、現在時刻の3日前のタイムスタンプより
//前のタイムスタンプが取得されていたら
if($ts < $time){
//unlink関数にフルパスを渡してやってファイルを削除
unlink($data);
}

}

}

?>

原始的なロジックとしては、こんなところでしょうか。
PHPには便利な定数があるので覚えておいたほうがよいです。
DIRECTORY_SEPARATOR定数は、Windowsだと円マークになりLinuxやMacなどではスラッシュになるので、
これも便利です。
    • good
    • 0
この回答へのお礼

大変ご丁寧にご教授いただきましてありがとうございます。

1つ1つ処理の詳細を書いていただいたおかげで
未熟な私でもとても良く理解する事ができました。

こんなに便利な定数があるとは全くもって知りませんでしたので
とても勉強になりました。

なかなか思うようにいかず、
検索しながらファイルの生成時間を利用してやるしかないと思っていただけに
とても助かりました。

本当にありがとうございました。

お礼日時:2010/09/15 06:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!