古いファイルを消す必要性
BIND+PHPによるDiCEで更新可能なダイナミックDNSサーバ構築でユーザ登録の際に、ランダムな仮登録ファイルを生成するようなスクリプトを書いた。
本登録することで仮登録ファイルを削除するのだが、仮登録だけで放置された場合には仮登録ファイルが残る。いつまでも残していても仕方ないので、一定時間たったら削除するスクリプトをPHPで書いた。
仕様
・自分が置かれてるディレクトリ内のファイルが対象
・自分自身は消さない
・現在から起算して、指定した時間以上古いものを削除
ソース
/******************************************************
Name : delold.php
Action : 指定時刻より前に作られたファイルを削除。
2007.11.03 Ver.0.01 Genki wrote.
Spec.
Ver.0.01 とりあえず。
*******************************************************/
//カレントディレクトリを自分の置かれている場所に。
$bool = chdir(dirname($_SERVER['PHP_SELF']));
var_dump($bool);
echo $_SERVER['PHP_SELF'];
//ディレクトリ内のファイル一覧取得
$res = opendir(".");
while($files[] = readdir($res));
closedir($res);
//現在時刻より1日前を削除指定時刻に
$dtime = time()-24*60*60;
for($i=2;$files[$i];$i++){//.と..を省くので$files[2]から検証
if($files[$i] != basename($_SERVER['PHP_SELF'])){ //自分自身を含まないように
$ctime = filectime($files[$i]); //ファイルの作成日時を取得
if($ctime < $dtime){ //削除基準と照らし合わせて
unlink($files[$i]); //古いものは削除。
}
}
}
?>
運用
そんなにシビアにしょっちゅう消さないといけないものでもないので、cronで毎日1回実行する。
つまり、最短で約1日、最長で約2日の寿命になる。
0 0 * * * apache php /home/*****/public_html/temporary/delold.php
問題点
ユーザをapacheで実行すればapacheに権限のあるファイルしか消さないだろうと思ってやってみたが、所有者rootでパーミッション644なファイルまで消しやがった。
crontabの第6フィールドは実行ユーザを指定するんじゃないんかな?これは明らかにrootで実行しちゃってる。
つーことは、このスクリプトを消しちゃいけないファイルがある場所に置けば、消しちゃいけないファイルを明日になった瞬間に消してくれるってわけか。
おーこえー。危ないもんを作ってしまった。