「WordPressで学ぶPHP(4)通信編」を発売しました。
本書は、「WordPressで学ぶPHP(1)変数・制御構造編」「WordPressで学ぶPHP(2)データ構造編」「WordPressで学ぶPHP(3)関数編」の続編にあたり、Webブラウザとサーバー(PHP)との通信と、PHPから他のサーバーに通信することについて解説します。
プレビュー時にできるファイルを定期的に自動削除する
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 {} \;