今回は、CakePHPを使って自作プログラムをCron Jobで動かす方法について書きます。 今回はサーバーにDreamhostを使ったのでDreamhostでCron Jobを動かす特有の方法も説明していきます。

まず、CakePHPでコマンドラインスクリプトを書く必要がありますが、CakePHPではShellという機能を使って簡単に実現することができます。

作成手順はCakePHPのリファレンス Cookbook (http://book.cakephp.org/#!/view/1106/The-CakePHP-Console) にある通りです。

まず最初にShellクラスを継承したクラスファイルを自分のAppフォルダの中 (CAKEPHP/myapp/vendors/shells/)の中に作成します。
自分はTwitter.phpというクラスファイルを作成、以下のようにつくりました。

class TwitterShell extends Shell {

  function main() {
      $this->out("TEST Task Run! n");

  }

}

これだけです。超シンプル!

では早速これをまずマニュアルで実行してみます。

SSHでDreamhostにログイン後、以下のようにコマンドを実行します。

/home/YOUR_ACCOUNT/DOMAIN.COM/cake/console/cake -app /home/YOUR_ACCOUNT/DOMAIN.COM/myapp/ twitter

ここで -appパラメータを使ってフルパスで自分のアプリケーションフォルダ(この場合myapp)をしてやらないと、CakePHPは常にappフォルダをみに行ってしまいます。

上手くいけば、

Welcome to CakePHP v1.3.7 Console
---------------------------------------------------------------
App : myapp
Path: /home/YOUR_ACCOUNT/DOMAIN.COM/myapp
---------------------------------------------------------------
TEST Task Run!

のように表示されます。

プログラムが正常に動くことを確認出来たので、次にDreamhostからCronjobに登録します。

Dreamhostのコントロールパネルにログイン後、「Goodies」の中の「Cron Jobs」を選択します。

「Add New Cron Job」ボタンをクリックしてCommand to runフィールドに先ほどの

/home/YOUR_ACCOUNT/DOMAIN.COM/cake/console/cake -app /home/YOUR_ACCOUNT/DOMAIN.COM/myapp/ twitter

を入力します。

最初は実行確認のために、Email output toフィールドにEmailを記入しておくことをお薦めします。

Cron Jobエントリーを保存して後は実行されるのを待つばかり、、、と思いきや、残念ながらDreamhostではさらにすこしばかり変更を加えてやらないと上手くスクリプトが走りません。

実際、問題は実行結果をEmailで受け取るとわかるのですが、

/home/YOUR_ACCOUNT/DOMAIN.COM/cake/console/cake: line 24: exec: php: not found

のようにエラーが帰ってきてしまいます。

これは/cake/console/cakeファイルがphpコマンドを実行できないというエラーなので、Dreamhost用にcakeファイルを以下のように書き換えてやる必要があります。

まず、一行目の

LIB=${0/%cake/}
APP='pwd'

の下に

TERM=linux
export TERM

を追加しておきます。これは必須ではないようですが、追加しておくことでサーバーメンテナンス等でエラーが起きたときに助けになるようです。

次に

exec php -q ${LIB}cake.php -working "${APP}" "$@"

のラインを

exec /usr/local/php5/bin/php -q ${LIB}cake.php -working "${APP}" "$@"

のように書き換えます。 これはphp5コマンドを明示的に呼び出しています。

以上で、Cron Jobのスクリプトが正常に実行されました。

余談ですが、DreamhostのCron Jobは最短で10分間隔でしか実行できないみたいです。 何個もCron Jobを登録したらもっと短い間隔で実行できるかもしれませんが、試してません。

これで、自分は今流行(?)のOAuthを使ったTwitter BOTの作成をしてみたのですが、それはまた次回のブログで説明するようにします。

最後に、

参考になったサイト

CakePHP Shells, and Cron Jobs –  http://www.utoxin.name/2009/07/cakephp-shells-and-cron-jobs/

Running a cakePHP shell script as cronjob on Dreamhost – http://www.pixelastic.com/blog/242:running-cakephp-shell-script-cronjob-dreamhost

Setting up cron jobs with Cake shells – http://planetcakephp.org/aggregator/items/4632-setting-up-cron-jobs-with-cake-shells

About ktatsuki

ktatsuki

ケートリック株式会社 代表をしています。 が、根っからのエンジニア脳です。 IBM Notes/Dominoの開発を得意としますが、 C++ / Java / PHP / Javascript などの言語を使ってWEBアプリ、iPhone / Android アプリ開発などをしたりします。 XPagesの仕事をしているとテンションが通常の1.25倍ぐらい高くなります。 I am owner of KTrick Co., Ltd. and Notes/Domino developer. IBM Champion for 2015 - 2017. I am interested in web application development and preferred languages are Notes/Domino, C++ / Java / PHP / Javascript.

3 Comments

  1. Pingback: CakePHP Shells内でAuth Componentを使ってUserを追加 | 無限なる開発ブログ

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です