12/08/2018, 13:03

Sử dụng Queue trên Laravel 4.2 với php-resque

Trong quá trình phát triển với Laravel 4.2, đôi khi ta cần dùng queues để xử lý một hay nhiều vấn đề nào đó. Trên Laravel 4.2 đã có Queue, tuy nhiên nếu nó chưa đáp ứng được tất cả các nhu cầu của bạn thì tôi sẽ giới thiệu cho bạn một thư việc giúp cho việc quản lý queue rất tốt trên PHP, ở đây tôi ...

Trong quá trình phát triển với Laravel 4.2, đôi khi ta cần dùng queues để xử lý một hay nhiều vấn đề nào đó. Trên Laravel 4.2 đã có Queue, tuy nhiên nếu nó chưa đáp ứng được tất cả các nhu cầu của bạn thì tôi sẽ giới thiệu cho bạn một thư việc giúp cho việc quản lý queue rất tốt trên PHP, ở đây tôi hướng đến việc sử dụng trên Laravel 4.2.

Cài đặt

Cấu hình bắt buộc

  • PHP 5.3+
  • Redis 2.2+

Việc cài đặt PHP-Resque rất đơn giản với composer:

{
    // ...
    "require": {
        "chrisboulton/php-resque": "1.2.x"  // Most recent tagged version
    },
    // ...
}

Bạn chỉ việc chạy composer install thì PHP-Resque sẽ được kéo về trong vendor.

Sử dụng Jobs

//Setting Redis database mà bạn sẽ sử dụng, mặc định là localhost với port 6379
Resque::setBackend('localhost:6379');
//Arguments đầu vào là một array với key và value
$args = ['name' => 'This is an arg'];
//Set một queue có độ ưu tiên default, tên class sử dụng là My_Job với arguments là $args
Resque::enqueue('default', 'My_Job', $args);

Khai báo một Job

class My_Job
{
    public function perform()
    {
        // Work work work
        echo $this->args['name'];
    }
}

Khi Queue thực hiện đến job đã được khai báo ở trên thì PHP-Reque tự động tìm đến class My_Job và sẽ thực hiện hàm perform. Trong function perfomr ta có thể get được $args được truyền vào trước đó bằng $this->args['name'] - get argument có tên là name. Jobs cũng có phương thức setUp và tearDown. Nếu setUp được khai báo, nó sẽ được gọi trước khi phương thức perform chạy, tearDown sẽ được gọi sau khi job hoàn thành.

Xoá một Job

Khi muốn xoá một job trong queue chúng ta có thể dùng như sau:

// Removes job class 'My_Job' of queue 'default'
Resque::dequeue('default', ['My_Job']);
// Removes job class 'My_Job' with Job ID '087df5819a790ac666c9608e2234b21e' of queue 'default'
Resque::dequeue('default', ['My_Job' => '087df5819a790ac666c9608e2234b21e']);
// Removes job class 'My_Job' with arguments of queue 'default'
Resque::dequeue('default', ['My_Job' => array('foo' => 1, 'bar' => 2)]);
// Removes multiple jobs
Resque::dequeue('default', ['My_Job', 'My_Job2']);
// Removes all jobs of queue 'default'
Resque::dequeue('default');

Tracking Job status

PHP-Resque cũng có khả năng kiểm tra trạng thái của job, xem nó đang trong trạng thái waiting, run, finished hay failed.

$token = Resque::enqueue('default', 'My_Job', $args, true);
echo $token;
$status = new Resque_Job_Status($token);
echo $status->get(); // Outputs the status
  • Resque_Job_Status::STATUS_WAITING - Job is still queued
  • Resque_Job_Status::STATUS_RUNNING - Job is currently running
  • Resque_Job_Status::STATUS_FAILED - Job has failed
  • Resque_Job_Status::STATUS_COMPLETE - Job is complete

Workers

Trong trường hợp bạn muốn sử dụng PHP-Resque với nhiều queue thuộc nhiều project khác nhau, thì đây chính là tính năng mà bạn cần. Chạy command rất đơn giản:

$ QUEUE=file_serve APP_INCLUDE=../application/init.php php bin/resque

Thiết lập độ ưu tiên

QUEUE=high,default,low APP_INCLUDE=app/queues.php php vendor/chrisboulton/php-resque/resque.php

PHP-Resque sẽ thực hiện các job dựa trên độ ưu tiên từ high, default hay low. PHP-Resque còn nhiều tính năng khác bạn có thể tham khảo tại PHP-Resque

Example tham khảo Push GCM Notifications với PHP-Resque

https://github.com/tranluan91/laravel/commit/6c6f31859570f8edef025d17af6f3dbc12d8f2a1

0