Giao diện
Concurrency (Đồng thời)
Giới thiệu (Introduction)
Đôi khi bạn cần thực thi nhiều tác vụ chậm không phụ thuộc lẫn nhau. Trong nhiều trường hợp, hiệu suất được cải thiện đáng kể khi chạy đồng thời. Laravel Concurrency facade cung cấp API đơn giản để thực thi closures song song.
Cơ chế hoạt động (How it Works)
Laravel serializes closures và gửi chúng đến một Artisan CLI command ẩn, giải mã và thực thi trong PHP process riêng. Kết quả được serializes ngược về process cha.
Drivers
Concurrency facade hỗ trợ 3 drivers:
| Driver | Mô tả |
|---|---|
process | (Mặc định) Chạy trong PHP processes con |
fork | Hiệu suất tốt hơn, chỉ dùng trong CLI context |
sync | Thực thi tuần tự — hữu ích cho testing |
Cài đặt cho driver fork:
bash
composer require spatie/forkChạy Tasks đồng thời (Running Concurrent Tasks)
Dùng method run truyền mảng closures:
php
use Illuminate\Support\Facades\Concurrency;
use Illuminate\Support\Facades\DB;
[$userCount, $orderCount] = Concurrency::run([
fn () => DB::table('users')->count(),
fn () => DB::table('orders')->count(),
]);Chọn Driver cụ thể
php
$results = Concurrency::driver('fork')->run([
fn () => DB::table('users')->count(),
fn () => DB::table('orders')->count(),
]);Thay đổi Driver mặc định
Publish cấu hình concurrency và chỉnh option default:
bash
php artisan config:publish concurrencyHoãn Tasks đồng thời (Deferring Concurrent Tasks)
Nếu bạn không cần kết quả trả về, dùng method defer — các closures sẽ được thực thi sau khi HTTP response đã được gửi cho user:
php
use App\Services\Metrics;
use Illuminate\Support\Facades\Concurrency;
Concurrency::defer([
fn () => Metrics::report('users'),
fn () => Metrics::report('orders'),
]);Điều này đặc biệt hữu ích cho các tác vụ logging, analytics, hoặc reporting không ảnh hưởng đến response time của user.