Bazen birbirine bağlı olmayan birkaç yavaş görevi yürütmeniz gerekebilir. Birçok durumda, görevleri eş zamanlı olarak yürüterek önemli performans iyileştirmeleri gerçekleştirilebilir. Laravel'in Eşzamanlılık cephesi, kapanışları eş zamanlı olarak yürütmek için basit ve kullanışlı bir API sağlar.

Eşzamanlılık Uyumluluğu

Laravel 10.x uygulamasından Laravel 11.x'e yükseltme yaptıysanız, uygulamanızın config/app.php yapılandırma dosyasındaki providers dizisine ConcurrencyServiceProvider'ı eklemeniz gerekebilir:

'providers' => ServiceProvider::defaultProviders()->merge([
    /*
     * Package Service Providers...
     */
    Illuminate\Concurrency\ConcurrencyServiceProvider::class,

    /*
     * Application Service Providers...
     */
    App\Providers\AppServiceProvider::class,
    App\Providers\AuthServiceProvider::class,
    // App\Providers\BroadcastServiceProvider::class,
    App\Providers\EventServiceProvider::class,
    App\Providers\RouteServiceProvider::class,
])->toArray(),
Dipnot : Eğer, Laravel 12.x sürümünü kullanıyorsanız bu kısımı geçebilirsiniz.

Eşzamanlılık (Concurrency) Nasıl Çalışır

Laravel, verilen kapanışları serileştirerek ve bunları gizli bir Artisan CLI komutuna göndererek eşzamanlılığı elde eder, bu komut kapanışları serileştirmez ve kendi PHP işlemi içinde çağırır. Kapanış çağrıldıktan sonra, ortaya çıkan değer ana işleme geri serileştirilir. Eşzamanlılık cephesi üç sürücüyü destekler: işlem (varsayılan), çatallanma ve senkronizasyon. Çatal sürücüsü varsayılan işlem sürücüsüne kıyasla gelişmiş performans sunar, ancak PHP web istekleri sırasında çatallanmayı desteklemediğinden yalnızca PHP'nin CLI bağlamında kullanılabilir. Çatal sürücüsünü kullanmadan önce spatie/fork paketini yüklemeniz gerekir:

composer require spatie/fork
Senkronizasyon sürücüsü, özellikle tüm eşzamanlılığı devre dışı bırakmak ve verilen kapanışları ana işlem içinde sırayla yürütmek istediğinizde test sırasında yararlıdır.

Eşzamanlı Görevleri Çalıştırma

Eşzamanlı görevleri çalıştırmak için, Eşzamanlılık cephesinin çalıştırma yöntemini çağırabilirsiniz. Çalıştırma yöntemi, alt PHP işlemlerinde eş zamanlı olarak yürütülmesi gereken bir dizi kapanışı kabul eder:

use Illuminate\Support\Facades\Concurrency;
use Illuminate\Support\Facades\DB;

[$userCount, $orderCount] = Concurrency::run([
    fn () => DB::table('users')->count(),
    fn () => DB::table('orders')->count(),
]);
Belirli bir sürücüyü kullanmak için sürücü yöntemini kullanabilirsiniz:

$results = Concurrency::driver('fork')->run(...);
Veya varsayılan eşzamanlılık sürücüsünü değiştirmek için eşzamanlılık yapılandırma dosyasını configublish Artisan komutuyla yayınlamalı ve dosyadaki varsayılan seçeneği güncellemelisiniz:

php artisan config:publish concurrency
Eşzamanlı Görevleri Erteleme

Bir dizi kapanışı eş zamanlı olarak yürütmek istiyorsanız ancak bu kapanışların döndürdüğü sonuçlarla ilgilenmiyorsanız, defer yöntemini kullanmayı düşünmelisiniz. Defer yöntemi çağrıldığında, verilen kapanışlar hemen yürütülmez. Bunun yerine, Laravel HTTP yanıtı kullanıcıya gönderildikten sonra kapanışları eş zamanlı olarak yürütecektir:

use App\Services\Metrics;
use Illuminate\Support\Facades\Concurrency;

Concurrency::defer([
    fn () => Metrics::report('users'),
    fn () => Metrics::report('orders'),
]);