Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kiedy php usuwa zmienne
deniol13
post
Post #1





Grupa: Zarejestrowani
Postów: 190
Pomógł: 2
Dołączył: 30.11.2009

Ostrzeżenie: (10%)
X----


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]
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Uriziel01
post
Post #2





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
Uriziel01
post
Post #4





Grupa: Zarejestrowani
Postów: 307
Pomógł: 37
Dołączył: 9.11.2010
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/wink.gif) Pozdrawiam.

Ten post edytował Uriziel01 5.01.2012, 11:44:19
Go to the top of the page
+Quote Post
thek
post
Post #5





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




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 (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
darko
post
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


~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.
Go to the top of the page
+Quote Post
Orzeszekk
post
Post #7





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


php w ogole ma gc? mi sie obilo o uszy ze wszelkie obiekty sa zwalniane dopiero po zakonczeniu skryptu
Go to the top of the page
+Quote Post
darko
post
Post #8





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Orzeszekk
post
Post #9





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

Ostrzeżenie: (0%)
-----


czyli robiac duzo malych metod zamiast malo duzych zmniejszamy pamieciozernosc?(IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
-=Peter=-
post
Post #10





Grupa: Zarejestrowani
Postów: 304
Pomógł: 51
Dołączył: 4.02.2005
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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ęć).

Ten post edytował -=Peter=- 5.01.2012, 20:18:33
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 19:53