crontabを自分でいじれない場合にDrupalのcron.phpを定期的に走らせる方法
投稿者:Nobu 投稿日時:2009/02/20(金) 19:59
in
Drupalはいろいろな処理をするために定期的にタスクを走らせる必要があります。この処理はcron.phpで実装されていて、ctontabを使うことができるホスティングサービスを使っていれば、それを定期的に走らせるだけで済みます。
しかしCrontabを使うことができない場合は他の方法で実行させるようにする必要があります。
簡単な方法はPoormanscron(貧乏人のCron)を使う方法です。
このモジュールを試したことはないのですが、いくつかの弱点が指摘されています。誰かがサイトを表示しないとcronがまったく走らないこと、逆にたくさんのヒットがあった場合、パフォーマンスに影響があることなどです。
そこで、C#プログラミングの練習もかねて、Windowsのサービスプログラムを作り、そこからcron.phpを定期的に呼び出すことにしました。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Net;
using System.Text;
namespace MoroCronCall
{
public partial class MoroCronCallService : ServiceBase
{
private readonly Uri pollingTarget = new Uri("http://yourserver/cron_rss.php");
private readonly object lockObj = new object();
public MoroCronCallService()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
timer.Enabled = true;
}
protected override void OnStop()
{
timer.Enabled = false;
}
private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
timer.Enabled = false;
timer.Interval = 60 * 60 * 4 * 1000; // 4 hours in milliseconds
lock (lockObj)
{
try
{
WebClient client = new WebClient();
System.IO.Stream st = client.OpenRead(pollingTarget);
System.IO.StreamReader sr =
new System.IO.StreamReader(st, System.Text.Encoding.GetEncoding("utf-8"));
string str = sr.ReadToEnd();
st.Close();
client.Dispose();
eventLog.WriteEntry("Cron was run\n\n" + str, EventLogEntryType.Information, 4);
}
catch (Exception ex)
{
eventLog.WriteEntry("Failed to update.\n" + ex.Message, EventLogEntryType.Error);
timer.Interval = 30 * 60 * 1000; // retry in 30 mintues
}
}
timer.Enabled = true;
}
}
}
cron.phpではなくcron_rss.phpを呼び出しています。この理由はcron.phpは何も表示を返してこないからで、代わりにrssフィードを返してくるcron_rss.phpを作ってみました。単にcron.phpをコピーして、以下のように変更を加えるだけです。
// Clean up
variable_set('cron_busy', false);
variable_set('cron_last', time());
watchdog('cron', t('Cron run completed'));
node_feed(); // この行を追加する
出来上がったサービスを自分のコンピューターで動かしています。この方法の欠点は自分のコンピューターをずっと動かす必要があることです。ただ、私の場合はどのみち、ずっと動かしっぱなしなので、これで構いません。
参考リンク:
cron (crontab) が使えない場合の裏技 ![]()

新しいコメントの投稿