サーバー内のある特定のファイルをコピーしてバックアップを作成したいという要望があったため、ファイルをコピーするためのPHPをcronで呼び出して定期実行することにしました。
ただファイルをコピーするだけだと、サーバー上にコピーされたファイルが溜まっていくので、作成されて一定期間が過ぎたファイルは自動的に削除されるようにする必要があり、これもPHP側で制御することになりました。
その時に作成したPHPを備忘録として残しておきたいと思います。
PHPでファイルのコピーを作成する
今回は、test.csvというファイルをbackupフォルダ内にコピーする、という内容で説明いたします。backupフォルダ内では、日付をファイル名に追加しています。
PHPを使ってファイルのコピーを作成するには、以下のように記述します。
$dirHome = '/home/hogehoge/foo.com/public_html/csv/';
$date = date('Ymd');
if(copy($dirHome . 'test.csv', $dirHome .'backup/test.csv')){
echo 'test.csvをコピーしました。';
rename($dirHome . 'backup/test.csv', $dirHome .'backup/test'.$date.'.csv');
echo 'test.csvをリネームしました。';
} else {
echo 'test.csvをコピーできません!';
}
まず$dirHomeに対象ファイルが存在しているパスを代入し、copyでコピーを作成します。ファイルが存在していてコピーが作成されたら、ファイル名に日付を追加します。
PHPで古いファイルを削除する
ファイルが作成されてから一定期間が過ぎたものを削除するには、以下のように記述します。
date_default_timezone_set('Asia/Tokyo');
$expire = strtotime("168 hours ago"); //7日前
$dir = dirname(__FILE__) . '/backup/';
$list = scandir($dir);
foreach($list as $value){
$file = $dir . $value;
if(!is_file($file)) continue;
$mod = filemtime( $file );
if($mod < $expire){
chmod($file, 0777);
unlink($file);
}
}
まず「date_default_timezone_set(‘Asia/Tokyo’);」でタイムゾーンを指定します。
「168 hours ago」の部分で、何時間以上経過していたら削除するのかを指定しています。上記の例だと、168時間なので7日以上経過していたら削除されます。
「$dir = dirname(__FILE__) . ‘/backup/’;」では、削除対象のフォルダを指定します。フォルダ内に削除対象のファイルが存在していた場合は、chmodでパーミッションを変更し、unlinkでファイルを削除しています。
cronでPHPファイルを実行する
今回対象となったサーバーはシックスコアですが、cronの設定は以下のようにしました。
| 分 | 00 |
| 時 | 05 |
| 日 | * |
| 月 | * |
| 曜日 | * |
| コマンド | /usr/bin/php5.3 -c /home/hogehoge/foo.com/php/php.ini /home/hogehoge/foo.com/public_html/backup.php |
毎日5:00にファイルのコピーと古いファイルの削除をするためのPHPファイルが実行されます。コマンドの「/usr/bin/php5.3」の部分は、PHPのバージョンやサーバーの仕様によって異なりますので、詳しくはサーバーのマニュアルを調べてみてください。
あとがき
cronでPHPを自動実行すると、結構色々なことができますよね。
ログファイルなど、特定のファイルをバックアップしたい時に、参考にしていただけると幸いです。

