CodeBlanks Logo Icon CodeBlanks

Bellek yönetimi

PHP kursu · Uzman · Ders 24/54

memory_get_usage() ve referans döngülerini kırarak bellek kullanımını yönetmeyi öğrenirsin.

memory_get_usage ve peak

PHP her istekte bellek ayırır ve çöp toplayıcı (garbage collector) artık erişilemeyen nesneleri temizler. memory_get_usage size o anki bellek tüketimini bayt olarak verir; memory_get_peak_usage ise isteğin başından beri ulaşılan en yüksek noktayı döner.

İkisi de true parametresi alırsa gerçek olarak ayrılan toplamı, false alırsa yalnızca kullanılan kısmı raporlar. Bellek patlamalarını izlemek için peak noktasını izlemek yeterlidir; her noktada memory_get_usage çağırmak ek yük yaratır.

Circular reference ve Spl veri yapıları

Bir nesne kendine işaret eden bir referans tutarsa (circular reference), çöp toplayıcı onu otomatik temizleyemez ve bellek sızar. PHP'nin çöp toplayıcısı döngüleri belirli aralıklarla tarar ama bu yavaştır; gc_collect_cycles ile elle tetikleyebilirsiniz.

SplFixedArray sabit boyutlu bir dizi olup daha az bellek harcar; SplStack ve SplQueue ise LIFO/FIFO erişimini yerleşik metotlarla sağlar. Yığın işlerinde SplStack kullanmak, sıradan dizi ile array_push/array_pop kombinasyonundan daha az bellek kullanır.

Uygulama SplStack ve SplQueue ile çalış

Bir SplStack oluştur ve 'elma', 'armut', 'kiraz' ekle (push). Bir SplQueue oluştur ve 'elma', 'armut' ekle (enqueue). echo $stack->count() . "\n" ve echo $queue->count() . "\n" yazdır. Sonra echo $stack->pop() . "\n" ve echo $queue->dequeue() . "\n" ile birer öğe çıkar ve yazdır.

Örnek çözümü göster
$stack = new SplStack(); ile başlat. push('elma'), push('armut'), push('kiraz'). $queue = new SplQueue(); enqueue('elma'), enqueue('armut'). echo $stack->count() . "\n"; echo $queue->count() . "\n"; echo $stack->pop() . "\n"; echo $queue->dequeue() . "\n";.
Örnek çözüm:
<?php
$stack = new SplStack();
$stack->push('elma');
$stack->push('armut');
$stack->push('kiraz');

$queue = new SplQueue();
$queue->enqueue('elma');
$queue->enqueue('armut');

echo $stack->count() . "\n";
echo $queue->count() . "\n";
echo $stack->pop() . "\n";
echo $queue->dequeue() . "\n";

Kendini test et

  1. Spl veri yapılarını eşleştir

    SplStack
    LIFO yığını
    SplQueue
    FIFO kuyruğu
    SplFixedArray
    Sabit boyutlu dizi
    memory_get_peak_usage
    En yüksek bellek
  2. SplStack push çağrısını tamamla

    $stack = new SplStack();
    $stack->____('elma');
    $stack->push('armut');
    echo $stack->count() . "\n";
    Cevabı göster
    $stack = new SplStack();
    $stack->push('elma');
    $stack->push('armut');
    echo $stack->count() . "\n";
  3. Circular reference neden sorun yaratır?

    • Daha hızlı erişim sağlar
    • SplStack ile çakışır
    • Çöp toplayıcı nesneyi otomatik temizleyemez
    • Belleği otomatik iade eder
    Cevabı göster

    Çöp toplayıcı nesneyi otomatik temizleyemez — Doğru. Döngüsel referansta çöp toplayıcı nesneyi temizleyemez, bellek sızar.

Uzman bölümündeki tüm dersler