クーロンでZend FrameworkのControllerを実行させるZend\Console

Zend\Console、なぜ今までこの存在に気付いていなかったのか。

 

cronによる定期実行でスクレイピングしたり、メールを受け取ってPHPを実行させたりさせるときに、当然テーブルへのSELECT,INSERT,UPDATEはよくあることです。

 

でも今まではZend\Consoleなんて使ったことなかったので、実行するPHPファイルに


    $connect = @mysql_connect( $server, $user, $password );
    mysql_query($query, $connect );

とかPHP+MySQL入門に書いてありそうな方法を使ってたわけです。フレームワークでMだVだCだとかカッコつけておきながら、クーロン用とかの実行ファイルは原始的な書き方になって納得してませんでした。

 

でももう大丈夫、Zend\ConsoleならcronでZFアプリのControllerを叩けるんです。

1. module.config.php


    // Placeholder for console routes
    'console' => array(
        'router' => array(
            'routes' => array(
                'example-zf-console' => array(
                    'options' => array(
                        'route'    => 'ex console',
                        'defaults' => array(
                            'controller' => 'Application\Controller\Index',
                            'action'     => 'ex-zf-console'
                        ),
                    ),
                ),
            ),
        ),
    ),

「ex console」と叩いたら、Indexコントローラのex-zf-consoleを叩け!とここでは書いています。

2. IndexController.php


class IndexController extends AbstractActionController
{
    public function indexAction()
    {
        return new ViewModel(); // display standard index page
    }
    
    public function exZfConsoleAction()
    {
        $request = $this->getRequest();
        if (!$request instanceof ConsoleRequest){
            throw new \RuntimeException('You can only use this action from a console!');
        }
        
        return "Done!
    }
    
}

module.config.phpのconsoleの箇所にIndexコントローラーのex-zf-consoleアクションを動かすと設定したので、そのアクションを記述します。スクレイピングとかしてるならここでモデルにセレクトさせたりインサートさせたりするとおもいます。通常のルーティングでこのアクションに来た場合は例外を発生させてブロックしてます。

3. crontab -e


0 10 * * * /usr/bin/php /var/www/public/index.php ex console

後は上のようにクーロンの設定を行います。毎日10時にex consoleを叩け、と書いています。コマンドプロンプトでも

php index.php ex console」とかで確認できます。

 

ということで、Zend\Consoleでcronが楽になったよ、という記事でした。