vxm/yii2-async Provide an easy way to run code asynchronously for Yii2 application

Yii2 Async ¶

  1. About it
  2. Requirements
  3. Installation
  4. Usage

Latest Stable Version Total Downloads Build Status Code Coverage Scrutinizer Code Quality Yii2

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

]));

1 0
3 followers
34 050 downloads
Yii Version: 2.0
License: BSD-3-Clause
Category: Others
Developed by: VUONG MINH VUONG MINH
Created on: May 7, 2019
Last updated: (not set)
Packagist Profile
Github Repository

Related Extensions