PHPerのための Movable Type 講座(その13)
公開日 : 2014-05-09 15:07:15
ちょっと間空きましたけど、続きます。PHPでワーカー/タスクを作る方法。
- PHPerのための Movable Type 講座(その1)
- PHPerのための Movable Type 講座(その2)
- PHPerのための Movable Type 講座(その3)
- PHPerのための Movable Type 講座(その4)
- PHPerのための Movable Type 講座(その5)
- PHPerのための Movable Type 講座(その6)
- PHPerのための Movable Type 講座(その7)
- PHPerのための Movable Type 講座(その8)
- PHPerのための Movable Type 講座(その9)
- PHPerのための Movable Type 講座(その10)
- PHPerのための Movable Type 講座(その11)
- PHPerのための Movable Type 講座(その12)
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では。