プレビュー時にできるファイルを定期的に自動削除する

MTQに「プレビュー時のキャッシュファイルの消去」という質問があがっていました。
この質問に答えてみます。

1.問題点

Movable Typeでは、ページ等のプレビューを行う際に、プレビュー用にページを再構築して、「mt-preview-XXX・・・」のようなファイル名でサーバーに保存するようになっています。
そして、プレビューの画面で「このブログ記事を保存する」等のボタンをクリックすると、プレビューのファイルが削除されます。

ただ、プレビューの際に、Webブラウザの戻るボタンを使う方もいます。
しかし、Webブラウザの戻るボタンがクリックされると、そのことがサーバーには伝わらないため、プレビューのファイルがサーバーに残ったままになってしまいます。

JavaScriptでonunloadイベントを拾って、戻るボタンがクリックされた(ページが移動した)ことをサーバーに伝える方法も考えられます。
ただ、Webブラウザによっては、特定の状況でonunloadイベントが発生しないこともあるようです。

また、プレビュー中にWebブラウザがクラッシュしたり、パソコン自体がクラッシュすることもあり得ます。
これらの場合でも、「プレビューが終わった」という情報がサーバーに伝わらないので、プレビューのファイルが残ってしまいます。

2.findコマンドでプレビューファイルをまとめて削除する

上記のことから、Webブラウザの戻るボタンがクリックされたときなどに、プレビューのファイルを自動的かつ確実に削除することは、完全にはできません。
ただ、戻るボタン等の影響で残ったままになっているプレビューファイルを、サーバー側で定期的にチェックして、削除することは可能です。

UNIX系のOSには、「find」というコマンドがあります。
このコマンドを使うと、条件に合致するファイルを検索し、それらに対して各種の処理を行うことができます。

今取り上げている例では、ウェブサイトのディレクトリの中で、ファイル名の先頭が「mt-preview」になっていて、かつ作成からある程度時間が経過しているファイルを、まとめて削除すれば良いです。
この処理をfindコマンドで行うには、以下のように書きます。
なお、ディレクトリはサーバー内でのパスで指定します。

find ウェブサイトのディレクトリ -name "mt-preview*" -mmin +削除までの時間(分単位) -exec rm -f {} \;

例えば、ウェブサイトを「/var/data/www」というディレクトリに出力しているとします。
また、このディレクトリの中で、作成から15分以上経過したプレビューファイルを削除したいとします。
この場合だと、以下のようにコマンドを実行します。

find /var/data/www -name "mt-preview*" -mmin +15 -exec rm -f {} \;

3.cronでファイルを定期的に削除する

次に、上記のfindコマンドを定期的に実行するようにします。

UNIX系のサーバーであれば、「cron」という仕組みを使って、定期的にコマンドを実行することができます。
cronの設定はサーバーによってさまざまですので、お使いのサーバーのヘルプ等を参照してください。

手動でcronを設定する場合だと、「crontab -e」のコマンドでcronの設定ファイル(crontab)を開き、実行するタイミングとコマンドを書きます。
例えば、15分ごとに、前述のfindコマンドを実行する場合だと、crontabに以下のような行を追加します。

*/15 * * * * find ウェブサイトのディレクトリ -name "mt-preview*" -mmin +削除までの時間(分単位) -exec rm -f {} \;