Sử dụng Queue Schedule trên Laravel 4.2 với php-resque-scheduler
Trong quá trình phát triển bạn cần thiết lập một schedule thực hiện một chức năng nào đó như gửi mail, ... thì php-resque-scheduler là một lựa chọn không tồi. Bạn có thể thiết lập schedule tự gửi mail cho user 5 phút sau khi đăng ký hay đặt lịch cho một campaign start vào một thời điểm nào đó chỉ ...
Trong quá trình phát triển bạn cần thiết lập một schedule thực hiện một chức năng nào đó như gửi mail, ... thì php-resque-scheduler là một lựa chọn không tồi. Bạn có thể thiết lập schedule tự gửi mail cho user 5 phút sau khi đăng ký hay đặt lịch cho một campaign start vào một thời điểm nào đó chỉ định, hay cập nhật schedule khi nào bạn cần.
Cài đặt
Cấu hình bắt buộc:
- PHP 5.3+
- Redis 2.2+
- PHP-Resque < 1.3 (do php-resque-scheduler chạy trên nền của PHP-Resque) Bài viết về PHP-Resque mời các bạn xem thêm tại https://viblo.asia/tranluan91/posts/ogBG29g6MxnL
$ composer require chrisboulton/php-resque-scheduler
Hay
{ // ... "require": { "chrisboulton/php-resque-scheduler": "^1.1" // Most recent tagged version }, // ... }
sau đó chạy composer install để tiến hành cài đặt.
Delayed Jobs
Hiện tại php-resque-scheduler mới chỉ support delayed jobs có khả năng đẩy một job vào Queue theo timestamp nhất định hay số giây được chỉ định, nó cũng có khả nămg thực hiện tương tự như CRON.
Sử dụng scheduler cho việc gửi mail sau một khoảng một tiếng:
require 'Resque/Resque.php'; require 'ResqueScheduler/ResqueScheduler.php'; $in = 3600; //1 hour $args = ['id' => $user->id]; ResqueScheduler::enqueueIn($in, 'email', 'SendFollowUpEmail', $args);
Đoạn code trên thực hiện lưu một job trong delayed queue trong 1 giờ, sau đó 1 giờ tự động đẩy job đó vào queue và thực hiện việc gửi mail trong function perform của class SendFollowUpEmail. Bạn cũng có thể sử dụng một UNIX timestamp hay một DateTime object để khởi tạo resque-scheduler:
require 'Resque/Resque.php'; require 'ResqueScheduler/ResqueScheduler.php'; $time = 1332067214; ResqueScheduler::enqueueAt($time, 'email', 'SendFollowUpEmail', $args); $datetime = new DateTime('2012-03-18 13:21:49'); ResqueScheduler::enqueueAt(datetime, 'email', 'SendFollowUpEmail', $args);
Chú ý: Resque-scheduler không đảm bảo việc thực hiện job chính xác theo thời gian được chỉ định. Bởi vì khi đến thời gian chỉ định job sẽ được đẩy vào queue, do đó nó bị phụ thuộc bởi số lượng và độ ưu tiên thực hiện jobs của queues trong workers.
Xóa delayed jobs
Khi bạn muốn xóa một delayed job đang trong trạng thái pending theo timestamp và arguments đã được add
$dateTime = new DateTime($dateTime); ResqueScheduler::removeDelayedJobFromTimestamp($dateTime, 'email', 'SendFollowUpEmail', $args);
Worker
Do php-resque-scheduler chạy trên nền php-resque nên việc thiết lập worker cũng tương tự như php-resque được đề cập ở trên
$ RESQUE_PHP=vendor/chrisboulton/php-resque/lib/Resque.php REDIS_BACKEND=$redisBackend REDIS_BACKEND_DB=$redisBackendDB COUNT=1 INTERVAL=5 APP_INCLUDE=app/queues.php php vendor/chrisboulton/php-resque-scheduler/resque-scheduler.php
Command trên chỉ được thực hiện sau khi bạn đã chạy php-resque.