cron (crontab) が使えない場合の裏技

Drupal でサイトを運営する上で、いくつかの機能には定期的な cron.php の実行が必要となるものがあります。 例えば、検索用の索引付けやログの定期削除、コンテンツの更新を他サイトに知らせるための ping 送信、あるいはアグリゲータなどです。

cron.php の実行のためには、Drupal をインストールしたディレクトリにある cron.php にアクセスすればよく、一般に、Unix 系サーバであれば crontab(以下、単に cron) を、MS-Windows 系サーバであれば定期的にコマンドを実行する同種のアプリケーションを使用し、wget や lynx などのユーザが対話しなくとも使用できるツールを定期的に起動し、cron.php にアクセスさせます。

ところがこれらは、無料あるいは廉価なホスティングサービス(レンタルサーバ)では、利用できないことが少なくありません。

このような場合、

  1. 定期的にブラウザから手動でアクセスする
  2. アプリケーションなどを使用して、自身の PC から定期的にアクセスする
  3. poormanscron のようなモジュールを使用し、ユーザのサイトへのアクセスを利用する

など、いくつかの方法がありますが、どれも短所が多く、cron の代用としてはスマートではありません。
そこで、寝ている間でも定期的に cron.php を実行してくれ、かつ、無料で利用できる、cron の代用となる方法をご紹介します。

WEB 型 RSS リーダによる cron の代用

昨今、ブログのブームと相まって、WEB 上で多くのサイトの RSS を読むことのできる、WEB 型 RSS リーダのサービスを行うサイトが増えてきました。 これは、ユーザが登録した特定のサイトの RSS を定期的に取得し、それをユーザが WEB 上で閲覧できるというサービスです。

ここまで読んで、飲み込みの早い方なら「ああ、なるほど」と思ったことでしょう。 そう、このサービスは『定期的に特定のアドレスにアクセス』してくれるのです。
つまり、これを利用して定期的に cron.php にアクセスしてもらえば、cron を利用した場合と同等の効果が得られることになります。
ですが、少しだけ待ってください。 単純に cron.php にアクセスするだけでは空白のページが返るだけで、提供されているサービス本来の目的とは異なり、明らかにサービスの乱用となってしまいます。
そのため、この方法を利用する場合は、必ず RSS フィードを返し、サービス本来の目的に沿うようにする必要があります。

以下に、「はてな」を利用した具体的な方法を示しますので、それを参考にして、きちんと RSS フィードの取得をするようにしてください。

1) Drupal をインストールしたディレクトリにある cron.php をエディタで開き、最終行に以下の1行を追加します。

// Clean up
variable_set('cron_busy', false);
variable_set('cron_last', time());
watchdog('cron', t('Cron run completed'));

node_feed();  // この行を追加

2) ファイル名が cron.php である必要はないので、ここでは cron.php のファイル名を rss.php に変更します。
3) 「はてな」へ行きログインします。(アカウントの取得方法等は、ここでは説明しません)
4) http://r.hatena.ne.jp/アカウント名/poweredit で「フィードの新規追加」から URL を登録します。

フィードの新規追加

5) 「次へ」をクリックして「フィードの確認」へ進み、内容が正しければ「追加する」をクリックします。

フィードの新規追加

6) 以下のとおり、追加されました。

フィードの新規追加

7) 次に、RSS リーダのページへ行き、正しく RSS が取得されているかどうかを確認します。

フィードの新規追加

8) 正しく RSS が取得されているのを確認後、自身のサイトに管理者としてログインし、cron のログを表示させ、以下のように「cron は正常に実行されました。」となっていれば成功です。

フィードの新規追加

9) 「はてな」の場合、ほぼ2時間おきに定期受信するようです。 ほとんどのサイトでは、この程度の頻度で充分でしょう。
ですが、もし、さらに頻度を上げたい場合は、複数の同種サービス提供サイトを併用することで実現が可能です。 たとえば、1時間おきに定期受信する2ヶ所のサイトのサービスを併用すると、1時間に2回 cron.php が実行されることになり、30分に1回と等価(あくまでも理論値です)になります。


最後になりますが、ここでご紹介した方法は、cron 等が利用できない場合の最終手段と考え、不必要に乱用することは絶対に避けてください。
また、この方法は、必ず自己責任において利用してください。 この方法を利用した事によって、いかなる不利益を被った場合においても、筆者 imagine 並びに Drupal Japan は一切の責を負いません。


更新履歴

  • 2006/08/05 - 初版リリース
  • 2006/08/22 - location で rss フィードの uri に飛ばすと、賢いリーダーの場合、転送先の uri に更新してしまうので、直接 node_feed() を呼ぶように変更。