An extension provide an easy way to run code asynchronous and parallel base on spatie/async wrapper for Yii2 application.
Require Yii2 Async using Composer:
composer require vxm/yii2-async
Add the component to your application configure file:
[
'components' => [
'async' => [
'class' => 'vxm\async\Async',
'appConfigFile' => '@app/config/async.php' // optional when you need to use yii feature in async process.
]
]
]
Because async code run in difference process you need to setup yii environment to use
components via property appConfigFile
. Example of an async app config file:
define('YII_ENV', 'dev');
define('YII_DEBUG', true);
return [
'id' => 'async-app',
'basePath' => __DIR__,
'runtimePath' => __DIR__ . '/runtime',
'aliases' => [
'@frontend' => dirname(__DIR__, 2) . '/frontend',
'@backend' => dirname(__DIR__, 2) . '/backend'
]
];
Make sure all of your aliases define in it to support an autoload.
After add it to application components, now you can run an async code:
Yii::$app->async->run(function() {
// do a thing.
});
When creating asynchronous processes, you can add the following event hooks on a process in the second parameter.
Yii::$app->async->run(function() {
if (rand(1, 2) === 1) {
throw new \YourException;
}
return 123;
}, [
'success' => function ($result) {
echo $result; // 123
},
'catch' => function (\YourException $exception) {
// catch only \YourException
},
'error' => function() {
// catch all exceptions
},
'timeout' => function() {
// call when task timeout default's 15s
}
]);
Sometime you need to wait a code executed, just call wait()
after run()
:
Yii::$app->async->run(function() {
// do a thing.
})->wait();
Or you can wait multi tasks executed:
Yii::$app->async->run([YourAsyncClass::class, 'handleA']);
Yii::$app->async->run([YourAsyncClass::class, 'handleD']);
Yii::$app->async->run([YourAsyncClass::class, 'handleC']);
Yii::$app->async->run([YourAsyncClass::class, 'handleD']);
$results = Yii::$app->async->wait(); // results return from tasks above.
Besides using closures, you can also work with a Task. A Task is useful in situations where you need more setup work in the child process.
The Task class makes this easier to do.
use vxm\async\Task;
class MyTask extends Task
{
public $productId;
public function run()
{
// Do the real work here.
}
}
// Do task async use like an anonymous above.
Yii::$app->async->run(new MyTask([
'productId' => 123
]));