2017 © Pedro Peláez
 

library yii2-queue

Queue component for Yii2

image

vlodkow/yii2-queue

Queue component for Yii2

  • Tuesday, April 3, 2018
  • by vlodkow
  • Repository
  • 2 Watchers
  • 0 Stars
  • 107 Installations
  • PHP
  • 0 Dependents
  • 0 Suggesters
  • 47 Forks
  • 0 Open issues
  • 12 Versions
  • 11 % Grown

The README.md

Queue Component for Yii2

This provides queue component for Yii2 (fork urbanindo/yii2-queue)., (*1)

Update: no server load + better readme to start using this package., (*2)

Installation

The preferred way to install this extension is through composer., (*3)

Either run, add:, (*4)

"repositories": [{
    "type": "package",
    "package": {
      "name": "vlodkow/yii2-queue",
      "version": "1.3.2",
      "source": {
        "url": "git@github.com:vlodkow/yii2-queue.git",
        "type": "git",
        "reference": "1.3.2"
      }
    }
  }],
  "require": {
    "vlodkow/yii2-queue": "1.3.*"
  }

to the require section of your composer.json file., (*5)

To use Redis queue or RabbitMQ, you have to add yiisoft/yii2-redis:* or videlalvaro/php-amqplib: 2.5.* respectively., (*6)

Setting Up

After the installation, first step is to set the console controller (config/console.php)., (*7)

return [
    // ...
    'controllerMap' => [
        'queue' => 'Vlodkow\Yii2\Queue\Console\Controller',
        'sleep' => 2,
        'rocket_chat_url' => ''
    ],
];

For the task worker, set a new module, e.g. task and declare it in the config (config/console.php)., (*8)

'modules' => [
    'task' => [
        'class' => 'app\modules\task\Module',
    ]
]

And then set the queue component. Don't forget to set the module name that runs the task in the component (config/console.php and config/web.php). For example, queue using AWS SQS:, (*9)

'components' => [
    'queue' => [
        'class' => 'Vlodkow\Yii2\Queue\Queues\SqsQueue',
        'module' => 'task',
        'url' => 'https://sqs.ap-southeast-1.amazonaws.com/123456789012/queue',
        'config' => [
            'key' => 'AKIA1234567890123456',
            'secret' => '1234567890123456789012345678901234567890',
            'region' => 'ap-southeast-1',
            'version' => 'latest'
        ],
    ]
]

Or using Database queue, (*10)

'components' => [
    'db' => [
        //the db component
    ],
    'queue' => [
        'class' => 'Vlodkow\Yii2\Queue\Queues\DbQueue',
        'db' => 'db',
        'tableName' => 'queue',
        'module' => 'task',
    ]
]

Usage

For mysql import table from db.sql, (*11)

Creating A Worker

Creating a worker is just the same with creating console or web controller. In the task module create a controller that extends Vlodkow\Yii2\Queue\Worker\Controller, (*12)

e.g., (*13)

class FooController extends Vlodkow\Yii2\Queue\Worker\Controller {

    public function actionBar($param1, $param2){
        echo $param1;
    }
}

To prevent the job got deleted from the queue, for example when the job is not completed, return false in the action. The job will be run again the next chance., (*14)

e.g., (*15)

class FooController extends Vlodkow\Yii2\Queue\Worker\Controller {

    public function actionBar($param1, $param2){
        try {
        } catch (\Exception $ex){
            \Yii::error('Ouch something just happened');
            return false;
        }
    }
}

Running The Listener

To run the listener, run the console that set in the above config. If the controller mapped as queue then run., (*16)

yii queue/listen

Posting A Job

To post a job from source code, put something like this., (*17)

use Vlodkow\Yii2\Queue\Job;

$route = 'foo/bar';
$data = ['param1' => 'foo', 'param2' => 'bar'];
Yii::$app->queue->post(new Job(['route' => $route, 'data' => $data]));

Job can also be posted from the console. The data in the second parameter is in JSON string., (*18)

yii queue/post 'foo/bar' '{"param1": "foo", "param2": "bar"}'

Job can also be posted as anonymous function. Be careful using this., (*19)

Yii::$app->queue->post(new Job(function(){
    echo 'Hello World!';
}));

Deferred Event

In this queue, there is a feature called Deferred Event. Basically using this feature, we can defer a process executed after a certain event using queue., (*20)

To use this, add behavior in a component and implement the defined event handler., (*21)

    public function behaviors() {
        return array_merge([
            [
                'class' => \Vlodkow\Yii2\Queue\Behaviors\DeferredEventBehavior::class,
                'events' => [
                    self::EVENT_AFTER_VALIDATE => 'deferAfterValidate',
                ]
            ]
        ]);
    }

    public function deferAfterValidate(){
        //Do something here.
    }

NOTE Due to reducing the message size, the $event object that usually passed when triggered the event will not be passed to the deferred event. Also, the object in which the method invoked is merely a clone object, so it won't have the behavior and the event attached in the original object., (*22)

As for ActiveRecord class, since the object can not be passed due to limitation of SuperClosure in serializing PDO (I personally think that's bad too), the behavior should use \Vlodkow\Yii2\Queue\Behaviors\ActiveRecordDeferredEventBehavior instead. The difference is in the object in which the deferred event handler invoked., (*23)

Since we can not pass the original object, the invoking object will be re-fetched from the table using the primary key. And for the afterDelete event, since the respective row is not in the table anymore, the invoking object is a new object whose attributes are assigned from the attributes of the original object., (*24)

Web End Point

We can use web endpoint to use the queue by adding \Vlodkow\Yii2\Queue\Web\Controller to the controller map., (*25)

For example, (*26)

    'controllerMap' => [
        'queue' => [
            /* @var $queue Vlodkow\Yii2\Queue\Web\Controller */
            'class' => 'Vlodkow\Yii2\Queue\Web\Controller',
        ]
    ],

To post this use, (*27)

curl -XPOST http://example.com/queue/post --data route='test/test' --data data='{"data":"data"}'

To limit the access to the controller, we can use \yii\filters\AccessControl filter., (*28)

For example to filter by IP address, we can use something like this., (*29)

    'controllerMap' => [
        'queue' => [
            /* @var $queue Vlodkow\Yii2\Queue\Web\Controller */
            'class' => 'Vlodkow\Yii2\Queue\Web\Controller',
            'as access' => [
                'class' => '\yii\filters\AccessControl',
                'rules' => [
                    [
                        'allow' => true,
                        'ips' => [
                            '127.0.0.1'
                        ]
                    ]
                ]
            ]
        ]
    ],

Testing

To run the tests, in the root directory execute below., (*30)

./vendor/bin/phpunit

Road Map

  • Add more queue provider such as MemCache, IronMQ, RabbitMQ.

The Versions

03/04 2018

dev-master

9999999-dev

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Avatar vlodkow

30/11 2015

1.2.5

1.2.5.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

05/08 2015

dev-hotfix-web-queue-poster

dev-hotfix-web-queue-poster

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

30/06 2015

1.2.4

1.2.4.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

30/06 2015

dev-add-test

dev-add-test

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

25/06 2015

1.2.3

1.2.3.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

12/06 2015

1.2.2

1.2.2.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

01/06 2015

1.2.1

1.2.1.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

01/06 2015

1.2.0

1.2.0.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

The Development Requires

by Petra Barus

08/04 2015

1.0.1

1.0.1.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

by Petra Barus

08/04 2015

1.0.0

1.0.0.0

Queue component for Yii2

  Sources   Download

MIT

The Requires

 

by Petra Barus