[ステップアップ! CakePHP] Shell を使ってコマンドラインで CakePHP

No Photo

イメージ

こんにちは、inoueです。いよいよサッカーW杯!それ以上に水曜夜の「イナズマイレブン」と日曜朝の「GIANT KILLING」に私は夢中です。

さて、CakePHP 連載の8回目はコマンドラインでCakePHPを活用する方法の紹介です。

以前のエントリー「【CakePHP】ShellとTaskで作る簡単コンソールアプリ」では、 対話式アプリケーションの作り方についてお話しました。
今回はcronを使った定時実行で役立つ CakePHP Shellの使い方をお話したいと思います。

Shell の一番のポイントは、webアクセスと同じ設定を利用できる点です。
通常のPHPのコマンドラインスクリプトですと、includeするファイルなどを別途指定したりなどに手間がかかります。
CakePHPならば、appディレクトリのパスを指定するので、そのappの設定をコマンドライン上でも利用できます。

実際に作成したものの一例として、「一定時間ごとにメールを複数送信する Sendmailタスク」を紹介します。

これは、プログラム上メール送信が必要な処理があった場合、一旦DBに送信したいメール情報を蓄積し、cronによって定期的にメールを送信していくというものです。
Mailモデルに蓄積した送信したいメールのデータを蓄積し、このタスクが呼ばれるごとに10件ずつ送信する処理になっています。

送信できたデータには送信日時を登録し、送信済みとして処理をします。

メールの送信処理にはtanakaが本連載4回目で紹介したQdmailを使用しています。
ComponentもShellの中で使用できますが、その場合は下記のようにコアクラスのControllerもimportしてください。

<?php
App::import('Core', 'Controller');
App::import('Component', 'Qdmail');

class SendmailTask extends Shell {

    var $uses = array('Mail');

	/**
	* Controller class
	*
	* @var Controller
	*/
    var $Controller;

	/**
	* QDmailComponent
	*
	* @var QdmailComponent
	*/
    var $Qdmail;

	/**
	* タスクの初期化
	*
	*/
    function initialize() {
        parent::initialize();

        $this->Controller =& new Controller();
        $this->Qdmail =& new QdmailComponent(null);
        $this->Qdmail->startup($this->Controller);
    }

	/**
	* メール送信の実行
	*
	* @param array $settings
	* @return boolean
	*/
    function execute()
    {
        //未送信データ10件分取得
        $results = $this->Mail->getUnsentData(10);

        if (count($results) == 0) {
            return true;
        }

        $sendCount = 0;
        foreach($results as $data) {

            $smtp = array(
                'host'=> 'localhost', //メールサーバー
                'port'=> 25, //これはSMTPAuthの例。認証が必要ないなら 25 でOK。
                'from'=> 'returnpath@example.jp',  //Return-path: になります。
                'protocol'=>'SMTP', // 認証が必要ないなら、'SMTP'
            );

            //Qdmailコンポーネントを使ってメール送信
            $this->Qdmail->lineFeed("\n");
            $this->Qdmail->smtp(true);
            $this->Qdmail->smtpServer($smtp);

            // to設定
            if ($data["Mail"]["to_email"]) {
                $to_array = explode(",", $data["Mail"]["to_email"]);
                foreach ($to_array as $address) {
                    $this->Qdmail->to($address, null, true);
                }
            }

			// from設定
            $this->Qdmail->from($data["Mail"]["from_email"]); 

			// 件名設定
            $this->Qdmail->subject($data["Mail"]["subject"]);

			// 本文設定
            $this->Qdmail->text($data["Mail"]["body"]);

			//送信実行
            $return = $this->Qdmail->send();
            $this->Qdmail->reset();
            
			if ($return) {
                //送信完了日時を登録する
                $this->Mail->create();
                $data["Mail"]["sent"] = date('Y-m-d H:i:s');
                $this->Mail->save($data);
                $sendCount++;
            } else {
                //エラー処理
				//(略)
            }
        }
        $this->out(date('Y-m-d H:i:s') . ": ". $sendCount . " mails sent.");

    }
}
?>

cronの設定側に下記のように設定すれば、10分ごとにメール送信処理が行われます。

*/10 * * * *  cake sample sendmail -app /home/sample/app

以上、Shellの活用方法についてしました。ぜひチャレンジしてみてください。

今回をもちまして「ステップアップ! CakePHP」の連載を終了します。
ご意見・ご感想、CakePHPを使ったwebアプリケーション開発の依頼など、ぜひお寄せください!
お待ちしております。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ