2012-12-29 20 views
6

Kod ilustruje lepiej co pytam:Czy PHP pobiera lokalne zmienne natychmiast po zakończeniu funkcji?

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 

Więc wiem, że $ var zostanie uwolniony w pewnym momencie, ale nie w PHP zrobić to skutecznie? A może muszę ręcznie zdemontować drogie zmienne?

+0

* sprawnie * - nie można pytać w ten sposób. To, co myślisz, że * efektywnie * może być czymś innym (najprawdopodobniej ze względu na twój styl zadawania BTW), co faktycznie ** jest ** efektywnie * w PHP. – hakre

+0

cóż, zrób to tak szybko, jak to oczywiste, że zmienna nie będzie już używana. –

+0

Jeszcze wcześniej. Po zakończeniu funkcji wszystkie lokalne * zmienne * zniknęły. Nie ma znaczenia, czy dane pozostają (chwilowo) w pamięci czy nie. Ale żeby wiedzieć, że musisz wiedzieć trochę więcej o zarządzaniu pamięcią, co chyba nie jest twoją siłą (proszę nie obrażać).Byłoby zbyt drogie, aby de-alokować bloki pamięci z systemu od razu, tylko dlatego, że zmienna lokalna nie jest już używana. – hakre

Odpowiedz

3

Można zobaczyć ten przykład w klasie, to dlatego, że można „złapać” uwalniając zmienną w klasie destruktor:

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(); 

This script wyjścia:

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

Tak jest teraz jasne, że zmienne są niszczone przy wyjściu funkcji.

+0

Nie dotyczy to jednak głównego zakresu. Możesz także ustawić zmienną obiektową w głównym skrypcie i zobaczyć, kiedy zostanie ona zniszczona - będzie ona przechowywana aż do końca, nawet jeśli wcześniej jawnie nazwiesz jej destruktor! – Voitcus

2

Tak to dlatego $var jest zadeklarować na stos i uzyskać jasne, jak tylko to wykracza poza zakres

Można odnieść to https://stackoverflow.com/a/5971224/307157

+1

Nie widzę absolutnie nic w tym łączu, które nawet wskazuje na to, co określasz. Ta strona dotyczy wyłącznie semantyki. Wszelkie inne odniesienia? -1 na razie. – delnan

2

Więc wiem, że $ var zostanie uwolniony w pewnym momencie, ale czy PHP robi to wydajnie? A może muszę ręcznie zdemontować drogie zmienne?

Tak, PHP to dobra robota. Jest to pytanie, o którym nigdy nie powinno się myśleć. W twoim przypadku wolę pomyśleć o chwili pomiędzy $var = .. a return .., ponieważ jest to moment, w którym nie można uniknąć zużycia pamięci. Powinieneś spróbować znaleźć rozwiązanie, w którym nie musisz pobierać całego zestawu danych za pomocą get_huge_amount_of_data(), a następnie wybrać pojedynczy element, ale tylko te, których potrzebujesz.

4

Tak, to się uwolni.

Można to sprawdzić za pomocą:

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(); 

wyjściowa:

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

Przed funkcja PHP stosowane 273312 bajtów.
Zanim funkcja została zakończona, ponownie sprawdziliśmy zużycie pamięci i użyto 383520.
Sprawdziliśmy rozmiar zawartości $, która wynosi 110000 bajtów.
273312 + 110000 = 383312
Pozostałe 208 bajty są od innych zmiennych (my tylko liczone $ content)
Po funkcja została zakończona sprawdziliśmy zużycie pamięci ponownie i to z powrotem do (prawie (różnica 40 bajtów)) tak samo jak było wcześniej.

Różnica 40 bajtów prawdopodobnie będzie deklaracjami funkcji i deklaracją pętli for.

Powiązane problemy