Skip to content

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:

DriverMô tả
process(Mặc định) Chạy trong PHP processes con
forkHiệu suất tốt hơn, chỉ dùng trong CLI context
syncThực thi tuần tự — hữu ích cho testing

Cài đặt cho driver fork:

bash
composer require spatie/fork

Chạ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 concurrency

Hoã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.