WebAPI,メール受信駆動のCakePHPシェル

CakePHPのshellをキックする際には「cake/console/cake.php」ファイルを叩く。
それを今回はWebAPI受信とメール受信を起点として動かすて事でディレクトリ構成は以下とする。

/var/www/html/ ← WebのDocumentRoot
         ├api/
         ├app/
         ├cake/
         └vandors/

WebAPI受信駆動の場合

WebAPI受信用スクリプトの作成。
ファイル:/var/www/html/api/kick.php

<?php
$args = '';
foreach ($_GET as $key=>$value) {
    $value = urlencode($value);
    $args .= " {$key}={$value}";
}
exec('../cake/console/cake.php result_receiver receiveResult'.$args, $output, $ret);
file_put_contents('../log/result_receive.log', $output); // ← デバッグ用
print($ret); // ← 返り値
?>


キックさせるshellスクリプトの作成
ファイル:/var/www/html/app/vendors/shells/api_receiver.php

<?php
class ApiReceiverShell extends Shell {

    function receiveApi() {
        $params = array();
        foreach ($this->args as $arg) {
            $args = explode('=', $arg);
            if (count($args) < 2) {
                // エラー処理とかする。
                exit();
            }
            $params[$args[0]] = urldecode($args[1]);
        }

        // ここから実際の処理を記述
        // ・・・
    }

}
?>


これで「http://hoge.hoge/api/kick.php?arg1=hoge&arg2=hogehoge」とかにクリエストしてshellキック可能に。
引き数の渡し方と受け取り方はだいぶざっくりやってるので適当に書き換えるとして現状これでok。

メール受信駆動の場合

今回の環境はCentOSPostfix
受信するメールアドレスは「test@hoge.hoge」とする。
「/etc/postfix/main.cf」の「alias_maps」にて指定済みの設定ファイルを編集。
「/etc/postfix/main.cf」が「alias_maps = hash:/etc/aliases」の設定になっていた場合。
ファイル:/etc/aliases

test:	"|/usr/bin/php /var/www/html/cake/console/cake.php mail_receiver receiveMail -app /var/www/html/app/ >> /var/www/html/mail.log"

また、「/etc/postfix/main.cf」が「alias_maps = hash:/etc/aliases, regexp:/etc/aliases-regexp」の設定になっており、任意の正規表現パターンにマッチするアドレスへのメール受信時のみshellを実行させたい場合は以下の設定を追加してやればいい。
ファイル:/etc/aliases-regexp

/任意の正規表現パターン/ test


キックさせるshellスクリプトの作成。
ファイル:/var/www/html/app/vendors/shells/mail_receiver.php

<?php
class MailReceiverShell extends Shell {

    function receiveMail() {
        // ここから実際の処理を記述
        // ・・・
    }

}
?>


これで「test@hoge.hoge」とかにメール送信してshellキック可能に。
受け取ったメールのタイトルや本文、添付ファイル等の取得は「PEAR::Mail_mimeDecode」を使えばさっくりいける。


けどshell上での各処理の詳細はまた別の機会。