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ı
config
ublish 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'),
]);