crontabを自分でいじれない場合にDrupalのcron.phpを定期的に走らせる方法
in

Drupalはいろいろな処理をするために定期的にタスクを走らせる必要があります。この処理はcron.phpで実装されていて、ctontabを使うことができるホスティングサービスを使っていれば、それを定期的に走らせるだけで済みます。

しかしCrontabを使うことができない場合は他の方法で実行させるようにする必要があります。

簡単な方法はPoormanscron(貧乏人のCron)を使う方法です。

Poormanscron

このモジュールを試したことはないのですが、いくつかの弱点が指摘されています。誰かがサイトを表示しないと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) が使えない場合の裏技

新しいコメントの投稿

このフィールドの内容は非公開にされ、公表されることはありません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 使用できるHTMLタグ: <a> <em> <strong> <code> <cite> <ul> <ol> <li> <dl> <dt> <dd> <p>
  • 行と段落は自動的に折り返されます。
  • Amazon製品へのリンクを次の形式で作成することが出来ます。[amazon product_id inline|full|thumbnail]. 例: [amazon 1590597559 thumbnail]
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • 画像を追加することが出来ます。

書式オプションに関するより詳しい情報...

認証コード
This question is for testing whether you are a human visitor and to prevent automated spam submissions.
Image CAPTCHA
画像で表示されている数字および記号を入力してください。