[ステップアップ! CakePHP] Shell を使ってコマンドラインで CakePHP
こんにちは、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アプリケーション開発の依頼など、ぜひお寄せください!
お待ちしております。