bazilio / yii2-async
Provides translucent api for moving large tasks out of request context
Installs: 43 015
Dependents: 3
Suggesters: 0
Security: 0
Stars: 63
Watchers: 9
Forks: 18
Open Issues: 0
Type:yii2-extension
Requires
- php: >=5.4.0
- yiisoft/yii2: *
Requires (Dev)
- codeception/codeception: 2.0.*
- kriswallsmith/spork: dev-master
- pdezwart/php-amqp: dev-master
- phpunit/phpunit: 4.6.*
- yiisoft/yii2-codeception: *
- yiisoft/yii2-redis: *
README
Provides translucent api for moving large tasks out of request response
Install: php composer.phar require bazilio/yii2-async:dev-master
Requirments:
- php >=5.4
- Transports:
yii\db\Connection
- php-amqp
- yii2-redis
Using with AMQP:
php composer.phar require pdezwart/php-amqp:dev-master
main.php:
'components' => [ 'async' => [ 'class' => 'bazilio\async\AsyncComponent', 'transportClass' => 'bazilio\async\transports\AsyncAmqpTransport', 'transportConfig' => [ 'host' => 'localhost', 'login' => 'guest', 'password' => 'guest', 'vhost' => 'yii', 'exchangeName' => 'yii' ] ] ]
Using with Redis:
php composer.phar require yiisoft/yii2-redis:*
main.php:
'components' => [ 'redis' => [ 'class' => 'yii\redis\Connection', 'hostname' => 'localhost', 'port' => 6379, 'database' => 0, 'dataTimeout' => -1, // important for daemon and blocking queries ], 'async' => [ 'class' => 'bazilio\async\AsyncComponent', 'transportClass' => 'bazilio\async\transports\AsyncRedisTransport', 'transportConfig' => [ 'connection' => 'redis', ] ] ]
Using with MySQL (probably any sql, but tested only with mysql)
main.php:
'components' => [ 'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host=localhost;dbname=yii2advenced', 'username' => 'root', 'password' => '', 'charset' => 'utf8', ], 'async' => [ 'class' => 'bazilio\async\AsyncComponent', 'transportClass' => 'bazilio\async\transports\AsyncMysqlTransport', 'transportConfig' => [ 'connection' => 'db', ] ] ]
Apply migrations:
./yii migrate/up --migrationPath=@vendor/bazilio/yii2-async/migrations
Usage:
Create and send:
Test class example:
class DownloadTask extends AsyncTask { public $url; public $file; public static $queueName = 'downloads'; public function execute() { return file_put_contents($this->file, file_get_contents($this->url)); } } // create task $task = new DownloadTask(['url' => 'http://localhost/', 'file' => '/tmp/localhost.html']); \Yii::$app->async->sendTask($task);
Or call external method:
$task = new AsyncExecuteTask([ 'class' => 'common\components\MyDownloaderComponent', 'method' => 'download', 'arguments' => ['url' => 'http://localhost/', 'file' => '/tmp/localhost.html'] ]); $task::$queueName = 'downloads'; if (YII_ENV !== 'prod') { $task->execute(); } else { Yii::$app->async->sendTask($task); }
Execute:
Bash way:
Fill console config:
'controllerMap' => [ 'async-worker' => [ 'class' => 'bazilio\async\commands\AsyncWorkerCommand', ], ],
Run:
# Process and exit on finish ./yii async-worker/execute downloads # Process and wait for new tasks (only redis) ./yii async-worker/daemon downloads
Code way:
while ($task = \Yii::$app->async->receiveTask('downloads')) { if ($task->execute()) { \Yii::$app->async->acknowledgeTask($task); } }
For more code examples look into tests:
Runing tests:
vendor/bin/codecept run
Or in Docker:
./test.sh