[CodeIgniter2] CRONでコントローラを起動する
スポンサーリンク
ここに書かれている内容はかなり古いです。こちらをお読みください。
さくらインターネットのレンタルサーバーに設置してあるCodeIgniterをCRONで定期実行する必要があり、その方法について調べた結果のメモです。
以下手順です。
実行したいプログラムを書く
まず、普通にページを作るのと同じ要領でコントローラーを用意します。application/controllers/内にscheduling.phpを用意して、recording()というメソッドを書いたとします。
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); class Scheduling extends CI_Controller { function __construct(){ //略 } function index(){ //略 } function recording(){ //定期実行させたいコード } ?>
CRONでこのScheduling.phpのrecordingメソッドを起動するわけですが、このままでは、ブラウザでhttp://foo.com/scheduling/recordingにアクセスするとプログラムが実行されてしまいます。そこで、入力クラスの$this->input->is_cli_request()
を用い、コマンドライン以外からのアクセスをはじきます。
function recording(){ if( !$this->input->is_cli_request() ){ die(); }else{ //定期実行させたいコード } }
$this->input->is_cli_request()
はコマンドラインからの実行ならtrue、そうでなければfalseを返します。recording()メソッド内で$this->input->is_cli_request()
をチェックし、trueの場合だけ実行することで、ブラウザからのアクセスを拒否し、CRONからのみ起動するようになります。
cron.phpを用意する
Cron job bootstrapperという、コントローラーのメソッドをcronから呼び出すためのプログラムが提供されていますので、これを設置します。
cron.phpというファイルを用意し、リンク先のページのThe scriptの下のコードをコピーして貼り付けます。
cron.phpはCodeIgniterのルートディレクトリに設置します。
次に、修正箇所が2カ所あるので修正します。
49行目付近のdefine('CRON_CI_INDEX', '/var/www/vhosts/intranet/index.php');
を以下のように変更します。
define('CRON_CI_INDEX', '/var/www/vhosts/intranet/index.php');↓
define('CRON_CI_INDEX', './index.php');
これはindex.phpがデフォルトのままで、cron.phpはルートディレクトリに設置した場合の例なので、それ以外の場合はcron.phpからindex.phpへの相対パスに変更します。
もう1カ所は、さくらのレンタルサーバーでURLを変更して使っている場合(config.phpの$config[‘uri_protocol’]をQUERY_STRINGに変更している場合)に必要な修正です。
63行目付近からのswitch文内の以下のcaseに設定を付け加えます。
case '--run': // Simulate an HTTP request $_SERVER['PATH_INFO'] = $value; $_SERVER['REQUEST_URI'] = $value; $required['--run'] = TRUE; break;
これに、$_SERVER['QUERY_STRING'] = $value;
を付け加え、以下のように修正します。
case '--run': // Simulate an HTTP request $_SERVER['PATH_INFO'] = $value; $_SERVER['REQUEST_URI'] = $value; $_SERVER['QUERY_STRING'] = $value; $required['--run'] = TRUE; break;
この部分はhampom TODAYさんの「メール受信で codeigniter の メソッドを起動する方法」を参考にさせていただきました。ありがとうございました。
cronを設定する
以上で準備が整ったので、cronを設定します。
さくらのレンタルサーバーにログインし、コントロールパネルの「CRONの設定」に実行コマンドを入力します。
cd /home/ユーザー名/www/CodeIgniter設置フォルダ/; /usr/local/bin/php cron.php --run=/コントローラー名/メソッド名 1> /dev/null
上で用意した例の通りなら、
cd /home/ユーザー名/www/CodeIgniter設置フォルダ/; /usr/local/bin/php cron.php --run=/scheduling/recording 1> /dev/nullとなります。
あとは実行日時を設定して完了です。
以上でCRONからコントローラーのメソッドを起動できるようになりました。
スポンサーリンク
CodeIgniterカテゴリーの投稿
- [CodeIgniter3] クエリービルダーのINSERTでエスケープを行わない
- [CodeIgniter3] CRONでコントローラーのメソッドを呼び出す
- [CodeIgniter3] さくらレンタルサーバー設置時の.htaccess
- [CodeIgniter3] ControllerとViewを作成
- [CodeIgniter3] xampp開発環境へのインストール
- [CodeIgniter2] サイトマップを作る
- [CodeIgniter2] form_open()のメソッドをGETにする
- [CodeIgniter2] 多言語化時にオートロードで任意言語ファイルを読み込む
- [CodeIgniter2] ActiveRecordクラスjoinメソッド
- [CodeIgniter2] アクティブレコードでReplace文を使う