Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kiedy php usuwa zmienne
Forum PHP.pl > Forum > PHP
deniol13
Witam, kiedy PHP usuwa zmienne? W momencie wyjścia z bloku np mamy funkcję

  1. function zmienna()
  2. {
  3. $zmienne = array();
  4.  
  5. for( $i = 0; $i < 12000; $i++ )
  6. {
  7. $zmienne[ $i ] = microtime( true );
  8. }
  9. }


Czy w gdy dojdzie do końca skryptu. [koniec działania]
Uriziel01
Jeżeli wewnatrz metody to w momencie zakończenia wykonywania jej ciała. Choc to tez nie do końca prawda, w silniku PHP GC działa tak że zlicza referencje odwołujące się do danej zmiennej. Ale to już temat dla Google.
thek
Ogólnie rzecz ujmując, to znika ona gdy dobiega do końca zakres jej widoczności. Dla części zmiennych jest to koniec metody, dla innych koniec funkcji, dla jeszcze innych dopiero koniec skryptu. Wspomnienie o GC jest trafne, ale w teorii tylko, gdyż w PHP ten mechanizm wciąż nie jest tak dobry jak choćby w Javie (choć i tamten ma swoje potknięcia). No i nie zapomnijmy o tablicach superglobalnych takich jak POST, GET czy SESSION. One mają ciutkę inny czas żywota smile.gif
Uriziel01
No tak tak. Tylko ja odpowiadałem na pytanie sugerując sie kodem który podał pytający. Gdyby pytał o _POST/_SESSION etc. czy też ogólnie pokazał inny przykład to odpowiedział bym zapewne inaczej. Trzeba tutaj jeszcze sobie odpowiedzieć na pytanie co tak na prawdę użytkownik miał na mysli mówiąc 'usuwa zmienne' gdyż wyjście z zasięgu widoczności nie jest z tym jednak równoznacznie. Przynajmniej nie w PHP które jest samo w sobie memory leak'iem wink.gif Pozdrawiam.
thek
Akurat spojrzałem na kod pod kątem "np mamy funkcję", czyli jest ona tylko pewnym przykładem i temat należy poszerzyć o inne oraz nie wspomniane możliwości. Co do znikania z zasięgu i usuwaia to może źle się wyraziłem... Miałem na myśli gdy dany zakres już na dobre kończy działanie i nie wystąpi. Dla typowego skryptu jest to jego koniec, ale może to być choćby zakończenie połączenia (fclose, mysql_close), które zwalnia zasoby czy też uruchomienie destruktora. Ogólnie chyba najbliższe prawdy dla obiektówki będzie to co już napisałeś czyli "gdy liczba referencji spadnie do zera", zwłaszcza gdy obiekty grzebią się ze swoimi jakimiś zmiennymi statycznymi wink.gif
darko
~deniol13 w momencie wyjścia z bloku (jakiegokolwiek) zmienna zostałaby "zniszczona" pod warunkiem że zostałaby wcześniej zdefiniowana wewnątrz tego bloku. Akurat w tym przykładzie, który podałeś zmienna traci swój żywot w momencie zakończenia działania funkcji, w której została zdefiniowana.
Orzeszekk
php w ogole ma gc? mi sie obilo o uszy ze wszelkie obiekty sa zwalniane dopiero po zakonczeniu skryptu
darko
Zmienne będące poza zasięgiem danego bloku/instrukcji/funkcji/metody są automatycznie usuwane z pamięci (od php 5.3)

http://stackoverflow.com/questions/584960/...set-or-var-null
http://stackoverflow.com/questions/1145775...ipt-leak-memory
Orzeszekk
czyli robiac duzo malych metod zamiast malo duzych zmniejszamy pamieciozernosc?biggrin.gif
-=Peter=-
Wtedy w naturalny sposób współpracujemy z kulawym zbieraczem nieużytków z php i pamięć jest zwalniana przeważnie wtedy gdy trzeba. Chociaż to nie zawsze przekłada się na dodatnio na statystyki, zależy jakie to są funkcję. Jeśli to nie są funkcje które tworzą wiele zmiennych tymczasowych to różnicy pewnie nie będzie, albo będzie delikatnie na minus (definicja funkcji też zajmuje pamięć).
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.