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