Edited at

FuelPHPでクロージャをバックグラウンド実行する

More than 5 years have passed since last update.

というパッケージを作りました。

https://github.com/hackoh/fuel-background

(注記: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.