というパッケージを作りました。
(注記:WinとLinuxでは動作確認しましたが、Macで動かしたことありません。)
バックグラウンド実行については、「exec()するやらなんやらで、出来るよ~」というノウハウは既に沢山ありますが、
このパッケージの特徴は、「クロージャやハンドラを直接バックグラウンド実行」 させます。
主な使い方は、以下の通り。
適用前
<?php
// とても重く、時間がかかる処理
$object->very_heavy_process();
適用後
<?php
Background::forge(function($object) {
// とても重く、時間がかかる処理
$object->very_heavy_process();
}, array($object))->run();
// もしくは
Background::forge(array($object, 'very_heavy_process'))->run();
イベントリスナも貼れます。
<?php
Background::forge(array($object, 'very_heavy_process'))
->on('before', function() {
\Log::info('very heavy process will start !');
})
->on('after', function() {
\Log::info('very heavy process ended !');
})
->on('success', function() {
\Log::info('very heavy process returned true !');
})
->on('error', function() {
\Log::info('very heavy process returned false !');
})
->on('exception', function($e) {
\Log::info('very heavy process threw a exception !');
})->run();
run()の代わりにqueue()を使うと、順に実行されます。
<?php
// Normal running
Background::forge(function() {
for ($i = 0; $i < 2; $i++)
{
\Log::warning(1);
}
})->run();
Background::forge(function() {
for ($i = 0; $i < 2; $i++)
{
\Log::warning(2);
}
})->run();
Background::forge(function() {
for ($i = 0; $i < 2; $i++)
{
\Log::warning(3);
}
})->run();
// 1
// 2
// 3
// 1
// 2
// 3
// - This means that three processes exist.
// Queuing
Background::forge(function() {
for ($i = 0; $i < 2; $i++)
{
\Log::warning(1);
}
})->queue();
Background::forge(function() {
for ($i = 0; $i < 2; $i++)
{
\Log::warning(2);
}
})->queue();
Background::forge(function() {
for ($i = 0; $i < 2; $i++)
{
\Log::warning(3);
}
})->queue();
// 1
// 1
// 2
// 2
// 3
// 3
// - This means that only one process exists.