PHP Bellek Kullanımı: Ölçüm, Profil Çıkarma ve Sızıntı Belirtileri
PHP uygulamalarında bellek kullanımını doğru ölçmek, profil çıkarmak ve olası sızıntıları erken tespit etmek için resmi dokümantasyona dayalı pratik rehber.
Giriş
PHP, istek başına çalışan bir dil olarak bilinse de, uzun süreli çalışan işçiler (queue worker, Swoole, RoadRunner) ve büyük veri işleme betikleriyle bellek yönetimi kritik hale gelir. Yanlış ölçüm, yanlış optimizasyon ve gözden kaçan sızıntılar uygulamanızın çökmesine yol açabilir. Bu yazıda, PHP'nin resmi belgelerine dayanarak bellek kullanımını nasıl ölçeceğinizi, profil çıkaracağınızı ve sızıntı belirtilerini nasıl tanıyacağınızı adım adım ele alacağız.
PHP'de Bellek Ölçümü
PHP, bellek kullanımını izlemek için yerleşik fonksiyonlar sunar. En yaygın kullanılanlar memory_get_usage() ve memory_get_peak_usage()'dır. Bu fonksiyonlar, PHP'nin kendi bellek yöneticisi tarafından ayrılan bayt miktarını döndürür. memory_get_usage(true) ise sistemden ayrılan gerçek bellek miktarını gösterir.
Örnek:
<?php
echo 'Başlangıç: ' . memory_get_usage() . ' bayt' . PHP_EOL;
$dizi = range(1, 100000);
echo 'Dizi oluşturulduktan sonra: ' . memory_get_usage() . ' bayt' . PHP_EOL;
unset($dizi);
echo 'Dizi silindikten sonra: ' . memory_get_usage() . ' bayt' . PHP_EOL;
echo 'Tepe kullanım: ' . memory_get_peak_usage() . ' bayt' . PHP_EOL;
?>
Bu fonksiyonlar hakkında ayrıntılı bilgi için PHP resmi dokümantasyonu incelenebilir.
Bellek Sınırı ve memory_limit
memory_limit yönergesi, bir betiğin kullanabileceği maksimum belleği belirler. ini_get('memory_limit') ile mevcut değeri öğrenebilirsiniz. Sınır aşılırsa PHP ölümcül hata verir. Üretim ortamında bu değeri ihtiyaca göre ayarlamak önemlidir.
Profil Çıkarma Teknikleri
Bellek kullanımını profillemek için birkaç yaklaşım vardır:
- Xdebug:
xdebug.mode=profileile çalıştırıldığında, fonksiyon bazında bellek tahsisi ve çağrı grafiği çıkarır. Çıktıyıcachegrindformatında alıp KCacheGrind veya QCacheGrind ile görselleştirebilirsiniz. - Blackfire: Ticari bir profil aracıdır; bellek, CPU ve G/Ç metriklerini ayrıntılı raporlar.
- Manuel ölçüm: Kritik kod bloklarının başında ve sonunda
memory_get_usage()farkını alarak hangi bölümün ne kadar bellek tükettiğini görebilirsiniz.
Xdebug profilleme hakkında resmi bilgi için Xdebug dokümantasyonu ziyaret edilebilir.
Örnek: Basit Bir Bellek Profilcisi
<?php
function bellek_olc(callable $fonksiyon): array {
$baslangic = memory_get_usage();
$fonksiyon();
$bitis = memory_get_usage();
return [
'kullanilan' => $bitis - $baslangic,
'tepe' => memory_get_peak_usage(),
];
}
$sonuc = bellek_olc(function() {
$veri = str_repeat('x', 1024 * 1024); // 1 MB
// işlemler...
});
print_r($sonuc);
?>
Bellek Sızıntısı Belirtileri
PHP'de bellek sızıntıları genellikle aşağıdaki durumlarda ortaya çıkar:
- Döngüsel referanslar: Nesneler birbirine referans verdiğinde ve
unsetedilmediğinde, çöp toplayıcı (GC) devreye girse bile bellek serbest bırakılmayabilir. PHP'nin GC'sigc_collect_cycles()ile manuel tetiklenebilir. - Global değişkenler ve statik diziler: Uzun süreli işçilerde global veya statik değişkenlerde biriken veriler sızıntıya yol açar.
- Kapatma (closure) ve olay dinleyicileri: Referansları temizlenmeyen closure'lar bellekte kalır.
- Yanlış tamponlama: Çıktı tamponlama (
ob_start) kapatılmazsa bellek şişer.
Bu belirtileri izlemek için memory_get_usage() değerini düzenli aralıklarla loglayın. Örneğin, bir queue worker'da her iş sonrası bellek artışını kaydedin. Artış sürekliyse sızıntıdan şüphelenin.
Örnek: Döngüsel Referans ve GC
<?php
class Dugum {
public $sonraki;
}
$a = new Dugum();
$b = new Dugum();
$a->sonraki = $b;
$b->sonraki = $a;
unset($a, $b);
echo 'GC öncesi: ' . memory_get_usage() . PHP_EOL;
gc_collect_cycles();
echo 'GC sonrası: ' . memory_get_usage() . PHP_EOL;
?>
PHP'nin çöp toplama mekanizması hakkında resmi bilgi için PHP GC dokümantasyonu okunabilir.
Laravel Perspektifi
Laravel 13 ile birlikte gelen Illuminate\Support\Facades\Log ve queue worker'lar, bellek yönetimini kolaylaştıran araçlar sunar. Örneğin, queue:work komutu --memory seçeneği ile bellek limiti aşımında işçiyi yeniden başlatabilir. Laravel'in resmi dokümantasyonunda queue worker bellek yönetimi anlatılmaktadır. Ayrıca artisan komutları ile bellek kullanımını izleyebilirsiniz.
Sonuç
PHP'de bellek kullanımını ölçmek, profil çıkarmak ve sızıntıları tespit etmek için yerleşik fonksiyonlar ve harici araçlar yeterlidir. memory_get_usage() ve memory_get_peak_usage() ile anlık durumu izleyin; Xdebug veya Blackfire ile derinlemesine analiz yapın. Döngüsel referanslar, global değişkenler ve kapatma referansları gibi yaygın sızıntı kaynaklarına dikkat edin. Laravel gibi çerçevelerde queue worker'ların bellek limitlerini yapılandırın. Unutmayın, düzenli ölçüm ve loglama, üretimde beklenmedik bellek hatalarının önüne geçer.