Bellek yönetimi
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
-
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
-
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"; -
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.