Tại sao cần Queue trong WordPress?
- Email hàng loạt: thay vì gửi 500 email ngay trong request, chỉ cần push job vào queue và worker gửi dần.
- Xử lý ảnh/video: resize ảnh, tạo thumbnail, hoặc upload S3 có thể chạy nền.
- Đồng bộ API bên ngoài: WooCommerce đồng bộ sản phẩm với ERP/CRM không nên chạy trực tiếp khi người dùng click.
- Job định kỳ: clear cache, refresh feed, backup database.
Các lựa chọn triển khai Queue trong WordPress
- WP-Cron: tích hợp sẵn, đơn giản nhưng không realtime, phụ thuộc traffic.
- Action Scheduler: thư viện queue phổ biến (dùng trong WooCommerce), hỗ trợ job delayed, retry.
- Queue server ngoài: RabbitMQ, Redis Queue, SQS… mạnh mẽ nhưng phức tạp hơn, cần worker riêng.
Ví dụ 1: Queue đơn giản với Action Scheduler
Action Scheduler là lựa chọn an toàn và được battle-test bởi WooCommerce. Bạn có thể dùng nó cho bất kỳ job nền nào.
// functions.php
// Đăng ký job
function my_send_welcome_email( $user_id ) {
$user = get_user_by('id', $user_id);
wp_mail( $user->user_email, 'Chào mừng', 'Cảm ơn bạn đã đăng ký!');
}
// Đưa job vào queue, delay 60 giây
as_schedule_single_action( time() + 60, 'my_welcome_email_action', array( 123 ) );
// Hook để worker xử lý
add_action( 'my_welcome_email_action', 'my_send_welcome_email' );
Khi user đăng ký mới, bạn không gửi email ngay trong request. Thay vào đó, bạn push vào queue. Action Scheduler sẽ lo chạy job trong nền.
Ví dụ 2: Queue với Redis cho tác vụ nặng
Nếu site của bạn có Redis, có thể cài thêm library queue nhẹ. Ý tưởng: push job vào list Redis, worker PHP hoặc NodeJS đọc list này và xử lý.
// functions.php
// Push job vào Redis list
function my_queue_job( $data ) {
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->lPush('my_jobs', wp_json_encode($data));
}
// Worker PHP (chạy CLI riêng)
while (true) {
$job = $redis->brPop('my_jobs', 0);
$data = json_decode($job[1], true);
// xử lý công việc
error_log('Processing job: ' . print_r($data, true));
}
Cách này mạnh hơn, scale tốt hơn, nhưng cần sysadmin setup Redis + worker process. Phù hợp site thương mại điện tử lớn.
Ví dụ 3: Background process với WP-CLI
Bạn có thể tạo command WP-CLI để xử lý job, sau đó dùng cron server gọi định kỳ.
// plugin.php
if ( defined('WP_CLI') && WP_CLI ) {
WP_CLI::add_command( 'myjobs run', function() {
global $wpdb;
$jobs = $wpdb->get_results("SELECT * FROM wp_myjobs LIMIT 10");
foreach ( $jobs as $job ) {
// xử lý job
WP_CLI::success("Processed job ID {$job->id}");
$wpdb->delete('wp_myjobs', array('id' => $job->id));
}
});
}
Trên server, bạn set cronjob chạy wp myjobs run mỗi phút để xử lý dần queue.
Khi nào chọn giải pháp nào?
- Site nhỏ: chỉ cần WP-Cron hoặc Action Scheduler là đủ.
- Site vừa: Action Scheduler + Redis object cache.
- Site lớn: Queue server (RabbitMQ, SQS, Redis) + worker riêng.
Kết luận
Queue & Background Jobs là một trong những bước quan trọng để nâng WordPress lên mức enterprise. Thay vì làm mọi thứ trong request người dùng, bạn đẩy công việc nặng sang hàng đợi. Kết quả: website nhanh hơn, trải nghiệm tốt hơn, và hạ tầng dễ scale hơn. Nếu bạn đang xây site thương mại điện tử hay membership lớn, đừng bỏ qua kỹ thuật này.
Bình luận