Teknik rehber

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.

Yazılım geliştirme ve kodlama görseli
Görsel: Unsplash · Görsel kaynağı

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=profile ile çalıştırıldığında, fonksiyon bazında bellek tahsisi ve çağrı grafiği çıkarır. Çıktıyı cachegrind formatı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 unset edilmediğinde, çöp toplayıcı (GC) devreye girse bile bellek serbest bırakılmayabilir. PHP'nin GC'si gc_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.

🍪
Çerez Kullanımı

Kodumun Hatası, web sitesinin çalışmasını sağlamak ve kullanıcı deneyimini geliştirmek için çerezler kullanabilir. Zorunlu olmayan çerezler için tercihlerinizi belirleyebilir, ayrıntılı bilgiye Çerez Politikamızdan ulaşabilirsiniz.