アルファサード株式会社 代表取締役 野田 純生のブログ


PHPerのための Movable Type 講座(その13)


公開日 : 2014-05-09 15:07:15


PHPerのためのMovable Type

ちょっと間空きましたけど、続きます。PHPでワーカー/タスクを作る方法。

DynamicMTMLでタスク/ワーカーを作る

config.php によるDynamicMTML対応プラグインを作ります。詳しくはその11を参照。

タスクとワーカーの違いは、

  • ワーカー = データベースに保存されたキューを実行する
  • タスク = キューの有無にかかわらず定期的にコードを実行する

キューを登録するのは主にPerl側のプラグインになるでしょう。こちらの作成方法はMTのドキュメントを参考に。

通常はplugins/Foo/Worker/WorkerFoo.pm を作って登録することになります。

// plugins/Foo/php/config.php

<?php
class Foo extends MTPlugin {
    var $app;
    var $registry = array(
        'name' => 'Foo',
        'task_workers' => array(
              'worker_foo' => array(
                            'label' => 'Label of Foo',
                            'code'  => 'worker_foo',
                            'class' => 'Foo::Worker::WorkerFoo', ),
        ),
    );
    function worker_foo ( &$app, $jobs ) {
        $mt = MT::get_instance();
        foreach ( $jobs as $job ) {
            $meta = $job->arg;
            $meta = preg_replace( "/^.*(SERG)/", '$1', $meta );
            $meta = $mt->db()->unserialize( $meta );
            // ワーカーの処理
        }
    }
}

第二引数 $jobs に、キューに保存されたジョブの配列が渡されるので、これに処理を書いて行けば良いです。$job->arg にシリアライズされたデータが入っているケースがありますが、$mt->db()->unserialize( $meta ); で配列に割り戻せます。

cronジョブ又はタスクスケジューラに登録する

ワーカーを実行するためのスクリプトを作成します。 ワーカーの場合は以下のように。

$app->run_workers( 'Sleep秒', 'コード名' );

タスクの場合は以下。

$app->run_ tasks( 'コード名' );

公式ドキュメントに、プレビューファイルをクリーンアップするコードのサンプルがあります。

$app->stash( 'no_generate_directories', 1 ); を指定していますが、これを指定することで templates_c や cache、powercms_files の生成をスキップします。Web経由での実行で無い限りこの処理は不要になるので、この行を必ず指定してください(でないと、実行パスを起点としてディレクトリを生成しにいく→権限がなくてコケたりする原因になるかも)。

// plugins/Foo/php/worker/worker.php

<?php
    $mt_dir = dirname( dirname( dirname( dirname( dirname( __FILE__ ) ) ) ) ) . DIRECTORY_SEPARATOR;
    if (! file_exists ( $mt_dir . 'mt-config.cgi' ) ) {
        echo "mt-config.cgi was not found.\n";
        return;
    }
    require_once ( $mt_dir . 'php' . DIRECTORY_SEPARATOR . 'mt.php' );
    require_once ( $mt_dir . 'addons' . DIRECTORY_SEPARATOR . 'DynamicMTML.pack' .
                   DIRECTORY_SEPARATOR . 'php' . DIRECTORY_SEPARATOR . 'dynamicmtml.php' );
    $mt_config = $mt_dir . 'mt-config.cgi';
    $app = new DynamicMTML();
    $app->configure( $mt_config );
    $mt = MT::get_instance( NULL, $mt_config );
    $ctx =& $mt->context();
    $app->stash( 'no_generate_directories', 1 );
    $app->set_context( $mt, $ctx );
    $app->run_workers( 10, 'worker_foo' );
?>

Windowsの場合は以下のような感じで。間隔を指定して定期的に実行するようにします。

php -f C:\mt\plugins\Foo\php\Worker\worker.php

以上。PHPが得意なら、こういうアプローチもとれますよMTでは。



このブログを書いている人
野田純生の写真
野田 純生 (のだ すみお)

大阪府出身。ウェブアクセシビリティエバンジェリスト。 アルファサード株式会社の創業者であり、現役のプログラマ。経営理念は「テクノロジーによって顧客とパートナーに寄り添い、ウェブを良くする」。 プロフィール詳細へ