Posted filed under ServerSide.

Photo by IanVisits

 Twitterで友達に「Webサーバ上の古いファイルを消すスクリプトが欲しい」と相談されて、PHPで作ってみました。
このまま眠らせるのも勿体ないので、ブログ書くことにしました。

 はじめはcronとfind -exec rmしようと思ったんですが、sshが使えないらしいので、PHPで作って外部から定期的に呼び出すことにします。

 下のファイルを適当な所に設置して、Webcron.orgFree Web Cron Serviceなど外部から定期的にURLをアクセスしてくれるサービスに登録します。
(これらのサービスを私は利用したことがないので、内容や安定性についてはコメントできません)

 ダウンロードはgistから。


<?php
// sweeper.php - public domain
// まずは試しに ..../sweeper.php?debug=1で実行してください
 
$sweep_dir = "/tmp/data/"; // 消したいディレクトリ ex) "/tmp/data/" 最後の/は必須です
$expire_at = 30; // ファイルを保存する日数を設定します
$debug = array_key_exists('debug', $_GET);
date_default_timezone_set('Asia/Tokyo');
 
$num = sweep_files($sweep_dir, $expire_at ,$debug);
echo "Purged $num files";
 
function sweep_files($sweep_dir, $expire_at, $debug) {
  $count = 0;
  if(!($dir = @opendir($sweep_dir))){ die("can't open $sweep_dir");}
  while($file = readdir($dir)) {
    if($file=='.' || $file=='..') {
      // NOOP
    }
    else if(is_dir($file)) {
      $count += sweep_files($sweep_dir . $file . '/', $expire_at, $debug);
    }
    else {
      $name = $sweep_dir . $file;
      $mtime = filemtime($name);
      if((time() - $mtime) >= 60*60*24*$expire_at) {
        if(file_exists($name)) {
          if($debug) {
            $mtime_ymd = date("Y/m/d H:i:s", $mtime);
            echo "will purge> ".$mtime_ymd." $name<br/>";
          }
          else {
            unlink($name);
          }
          $count++;
        }
      }
    }
  } // end while
  closedir($dir);
  
  return $count;
}
 
?>

2 Responses to “特定のディレクトリ下の古いファイルを掃除するPHPスクリプト”

  1. bto

    system関数でtmpwatch実行する方が簡単で速いと思います
    system(‘/usr/sbin/tmpwatch –ctime 720 /tmp/data’);

  2. masuidrive

    > bto

    今回は、環境が特定できないので、外部コマンドを使わない方向で実装してみました。