Hafıza Sorunlarını Önlemek için Lazy Collections Kullanımı
Smart Tech Devs’te bir kurumsal B2B SaaS platformu geliştirirken, büyük iç veri dizilerini işlemek kaçınılmazdır. Örneğin, 500.000 kullanıcı kaydını döngüye alarak belli metadata filtreleriyle eşleşen bir analiz rutini veya özel bir raporlama sistemi düşünün. Standart Laravel yaklaşımı, standart Eloquent koleksiyonlarını kullanmaktır: $logs = ActivityLog::all();.
Küçük veritabanı tablolarında bu yöntem mükemmel çalışır. Ama kurumsal ölçekte bu yaklaşım, operasyonel bir tehlikedendir. Standart bir koleksiyon çağırdığınızda, Laravel tüm 500.000 kaydı aynı anda sistem RAM’ine yüklemeye çalışır, bu da ağır nesne yapıları ile sarılır. PHP işlem süreciniz, fiziksel sınırlarına hemen ulaşarak Allowed memory size exhausted hatasını fırlatır. Büyük veri kümesini temiz bir şekilde işlemek için, koleksiyon işleme dizilerini hemen RAM tahsislerinden ayırmanız gerekir; bunun için Lazy Collections kullanmalısınız.
PHP Generatörlerinin Gücü
Laravel 6 ile tanıtılan ve altında PHP Generators tarafından desteklenen Lazy Collections, milyonlarca satırı işleyip uygulamanızın hafıza tüketimini birkaç megabaytta sabit tutmanızı sağlar.
Büyük bir veri kümesini bellekte tam olarak derlemek yerine, bir Lazy Collection bir seferde tek bir öğe üretir. Diğer veriler veritabanı akışında sessizce kalır, zamanında yüklenir ve işlendiğinde bellekten hemen çıkarılır.
Aşama 1: Sorgu Builder’ları Cursor ile Değiştirme
Pahalı bir veritabanı çıkarımını hafıza dostu bir akışa dönüştürmek için, sorgunuzun sonuna cursor() yöntemini eklemeniz yeterlidir. Laravel, anında bir LazyCollection örneği döndürecektir.
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Models\ActivityLog;
use Illuminate\Http\Request;
class LogProcessingController extends Controller
{
public function processTelemetry(Request $request)
{
// ❌ ANTİ-PATTERN: 500k satırı hafızaya bir seferde çekiyor
// $logs = ActivityLog::where('status', 'error')->get();
// ✅ KURUMSAL PATTERN: Hafızayı 5MB altında tutuyor!
$logs = ActivityLog::where('status', 'error')
->cursor(); // LazyCollection döner
// Tam veri kümesini RAM'e yüklemeden temiz bir şekilde dizi işlemleri zincirleyebiliriz
$processedData = $logs->filter(function ($log) {
return $log->is_critical_breach;
})->map(function ($log) {
return [
'event_id' => $log->uuid,
'client_ip' => $log->ip_address,
'logged_at' => $log->created_at->toIso8601String(),
];
});
// Veritabanı bağlantısı, döngü başladığında yalnızca gerektiğinde satırları akıtır
foreach ($processedData as $item) {
app('telemetry.dispatcher')->send($item);
}
return response()->json(['status' => 'pipeline_complete']);
}
}
Mühendislik ROI’si
Lazy Collections’ı ağır hesaplama sistemlerinizde uygulayarak, öngörülebilir sistem ölçeklenmesi sağlarsınız. Hafıza tahsis eğrileri, dik bir üssel çıkıştan düz bir çizgiye kayar. Sunucunuz, büyük analiz tablolarını ardı ardına rahatça işleyebilir ve donanım kaynaklarınızı huzursuz etmeden standart API uç noktalarını kesintisiz bir şekilde işlemeye devam edebilir.
Kaynak: Orijinal Makale


