2012-12-29 18 views
6

kod soruyorum iyi ne gösterir: PHP serbest yerel değişkenler işlev bittikten hemen sonra biter mi?

function foo(){ 

    $var = get_huge_amount_of_data(); 

    return $var[0]; 
} 


$s = foo(); 

// is memory freed here for the $var variable created above? 

do_other_stuff(); // need memory here lol 

Yani o $ var bir noktada serbest alır biliyorum ama PHP verimli bir şekilde yapar? Ya da pahalı değişkenleri elimine etmek zorunda mıyım?

+0

* verimli * - Bu şekilde sorun olamaz. Düşündüğünüz şey * verimli bir şekilde * farklı bir şey olabilir (büyük olasılıkla BTW'ye soyunma tarzınız olabilir) aslında PHP'de * etkili * olan şeydir. – hakre

+0

iyi demek istediğim, değişkenin artık kullanılmayacağı belli oluyor. –

+0

Daha da erken. İşlev bittiğinde, tüm yerel * değişkenler * gider. Verilerin hafızada (geçici olarak) kalması ya da olmaması önemlidir. Ama bilmeniz gereken, bellek yönetimiyle ilgili biraz daha fazla bilgiye sahip olmanız gerektiğini bildiğim, ki bu sizin gücünüzü değil (herhangi bir suç değil).Bellek bloklarını sistemden ayırmak çok pahalı olur, çünkü sadece yerel bir değişken artık kullanılmaz. – hakre

cevap

3

, işte yıkıcı:

class a { 
    function __destruct(){ 
    echo "destructor<br>"; 
    } 
} 

function b(){ // test function 
    $c=new a(); 
    echo 'exit from function b()<br>'; 
} 

echo "before b()<br>"; 
b(); 
echo "after b()<br>"; 

die(); 

Bu komut dosyası çıkışları:

before b() 
exit from function b() 
destructor 
after b() 

Yani şimdi olduğu Fonksiyon çıkışında değişkenlerin yok edildiğini netleştirin.

+0

Ancak, bu ana kapsam için geçerli değildir. Ayrıca, ana komut dosyasında bir nesne değişkeni ayarlayabilir ve ne zaman imha edildiğini görebilirsiniz - daha önce tahribatçıyı daha erken aramış olsanız bile, 'ölmek' kadar devam edecektir! – Voitcus

2

Evet, $var çünkü yığın beyan ve net kısa sürede bu https://stackoverflow.com/a/5971224/307157

+1

Bu bağlantıda kesinlikle belirttiğiniz şeylere bile işaret eden hiçbir şey göremiyorum. Bu sayfa sadece semantik hakkındadır. Başka referanslar var mı? Şimdilik -1. – delnan

2

Yani o $ var bir noktada serbest alır biliyorum başvurabilir kapsam

dışına gider almak olduğunu ama PHP verimli mi yapıyor? Ya da pahalı değişkenleri elimine etmek zorunda mıyım?

Evet, PHP iyi bir iş yapar. Bu asla düşünmen gereken bir soru. Senin durumunda doğrusu bu bellek tüketimini kaçınamaz an, çünkü $var = .. ve return .. arasındaki andan düşünmek istiyorum. Eğer get_huge_amount_of_data() aracılığıyla bütün veri kümesini getir ve daha sonra tek bir öğeyi seçmek gerekmez nerede, bir çözüm bulmak için çalışmalısınız ama tek veri gerekiyor. Eğer "yakalamak" sınıfında bir değişkeni azat çünkü

Bir sınıfın bu örnek görebilirsiniz
4

Evet bu serbest olsun demek.

kullanarak bunları kontrol edebilirsiniz:

function a() { 
    $var = "Hello World"; 
    $content = ""; 
    for ($i = 0; $i < 10000; $i++) { 
     $content .= $var; 
    } 
    print '<br>$content size:'.strlen($content); 
    print '<br>memory in function:'.memory_get_usage(); 
    return null; 
} 

print '<br>memory before function:'.memory_get_usage(); 
a(); 
print '<br>memory after function:'.memory_get_usage(); 

çıkışı: fonksiyon PHP 273.312 bayt kullanılır

memory before function:273312 
$content size:110000 
memory in function:383520 
memory after function:273352 

önce

.
fonksiyonu bitirildi önce yine bellek kullanımını kontrol ve
383520. Biz 110,000 bayt $ içeriğinin boyutunu kontrol kullandı.
273312 + 110000 = 383312
Kalan 208 bayt diğer değişkenlerden geliyor (yalnızca $ içeriği saydık)
İşlev bittikten sonra bellek kullanımını tekrar kontrol ettik ve (neredeyse (40 baytlık fark)) durumuna geri döndük. daha önce olduğu gibi.

40 bayt farkının işlev bildirimleri ve döngü bildirimi olması olasıdır.

İlgili konular