[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の設定画面

以上でCRONからコントローラーのメソッドを起動できるようになりました。

スポンサーリンク


Comment