vxm / yii2-async
Provide an easy way to run code asynchronously for Yii2 application
Installs: 32 773
Dependents: 0
Suggesters: 0
Security: 0
Stars: 23
Watchers: 2
Forks: 6
Open Issues: 1
Type:yii2-extension
Requires
- php: ^7.1
- spatie/async: ~1.0.0
- yiisoft/yii2: ~2.0.13
Requires (Dev)
- symfony/stopwatch: ^4.0
This package is auto-updated.
Last update: 2024-10-13 13:44:28 UTC
README
About it
An extension provide an easy way to run code asynchronous and parallel base on spatie/async wrapper for Yii2 application.
Requirements
Installation
Require Yii2 Async using Composer:
composer require vxm/yii2-async
Usage
Configure
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.
Run async code
After add it to application components, now you can run an async code:
Yii::$app->async->run(function() { // do a thing. });
Async events
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 } ]);
Wait process
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.
Working with task
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 ]));