Cron によるジョブのスケジューリング (PHP)

ここでは Google App Engine PHP API で、ジョブをスケジューリングする方法を紹介します。

Google App Engine では Cron を使って、定期的にタスクをスケジュールすることができます。

Google App Engine (PHP) では、大まかに次の手順で Cron ジョブを設定できます。

手順 1. app.yaml に URL をスクリプトのマッピングを記述。

手順 2. cron.yaml でジョブの内容(実行対象及びスケジューリング内容等)を記述。

手順 3. 上記 app.yaml、cron.yaml を Google App Engine にデプロイする。

これだけで設定が完了します。

具体的には app.yaml には、handlers セクションに次のようにスクリプトを指定。

- url: /foo
  script: foo.php
  login: admin

ここで、任意のユーザーに /foo という URL を叩かれないように、login: admin を指定しています。これによって Google App Engine のそのアプリケーションの管理者のみのが外部から URL を要求できます。

cron.yaml には次のように記述します。

cron:
- description: foo cron example
  url: /foo
  schedule: every 6 hours

これによって、6時間毎 (every 6 hours) にジョブが実行されます。

尚、この schedule の書き方は次のようにかけます。

every N hours
every N hours from HH:MM to HH:MM
every 曜日 HH:MM
every day HH:MM

ここで N は数字です。hours のところは minutes (分) にも変更可能です。また HH:MM は 24時間表記による時刻です。曜日は mon, tue, wed... のような曜日指定です。 さらに第一月曜日 (1st mon) などの指定も可能です。

また時刻を指定するときは timezone: America/Los_Angeles のようにタイムゾーンの指定も可能です。それがなければ UTC として扱われます。

その他にも書きかたがあるので、ドキュメント "Scheduled Tasks With Cron for PHP" なども参考にしてください。

セキュリティ

上でも簡単に触れましたが、cron で指定する URL は(何も制限をかけなければ)基本的には誰でも要求できてしまいます。

外部からのジョブの実行を抑制するには、上述のように login: admin を指定することによって管理者だけからの要求を許可することが可能です。

Cron からのジョブ要求の際には HTTP ヘッダーに X-Appengine-Cron: true が設定されます。これは外部からの要求の時は、 Google App Engine によって削除されます。従って、これが設定されている場合は Cron からの要求であるとみなすことができます。

Cron からのジョブ要求の際の要求もとの IP アドレスは 0.1.0.1 になります。