Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wycieki pamięci a PHP
Forum PHP.pl > Forum > PHP
luinnar
Ostatnio (nie wiem skąd) naszła mni myśl: czy tworzę wyciek pamięci takim kodem:
  1. <?php
  2. $Object = new myClass();
  3. $Object = new myClass2();
  4. ?>


PHP samo usunie instancję klasy myClass z pamięci (tak jak to robi Java ze swoim odśmiecaczem pamięci) czy instancja zostanie w pamięci i zrobi się nam wyciek (tak jak w C)?
em1X
z tego co wiem, Zend posiada Garbage Collector.
SongoQ
Dobre nigdy sie nad tym nie zastanawialem. Najlepiej to sprawdzic odpalajac w petli np 1 mil razy i badajac przyrost pamieci. Wydaje mi sie ze nie bedzie zadnego przyrostu pamieci ale tego nie potrafie potwierdzic bo nie sprawdzalem.
dr_bonzo
Usuwa.

  1. <?php
  2.  
  3. class GCTest
  4. {
  5. public function __destruct()
  6. {
  7. print( "aaa niszcza mnie" );
  8. }
  9. }
  10.  
  11.  
  12.  
  13. for ( $i = 0; $i < 10; $i++ )
  14. {
  15. print( "[" );
  16. new GCTest();
  17. print( "]n" );
  18. }
  19.  
  20. ?>


Kod
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
[aaa niszcza mnie]
MalCom
Przy zabawie z class.tlen.php, bocik postawiony na tym chodzil przez kilka godzin, po zabicu procesu interpretatora php z ramu ubylo ok. 200MB.
Wydaje mi sie ze w php latwo o wycieki pamieci, przy niezbyt dobrze przemyslanych wiekszych skryptach, ktore jakis czas musza "chodzic". Bo w typowym oskryptowaniu stron to po zakonczeniu skryptu pamiec jest zwalniana.
Zeby poznac blizej problem trzeba byloby zajrzec w zrodla winksmiley.jpg
luinnar
Tak jak mówił SonoQ zrobiłem prosty test:

  1. <?php
  2. class test
  3. {
  4. private $sZmienna = 'aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccc
    cdddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeee'
    ;
  5. }
  6.  
  7. for($i = 1; $i < 1000000000; $i++)
  8. {
  9. $Obj = new test();
  10. }
  11. ?>

Po uruchomieniu tego skrypciku nic nie wskazywało na wzrost ilości zajmowanej pamięci.

Aby się upewnić zrobiłem 2 test pokazujący jak powinna się zapychać pamięć gdyby był wyciek:
  1. <?php
  2. class test
  3. {
  4. private $sZmienna = 'aaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccc
    cdddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeee'
    ;
  5. }
  6.  
  7. $aObj = array();
  8.  
  9. for($i = 1; $i < 1000000000; $i++)
  10. {
  11. $aObj[$i] = new test();
  12. }
  13. ?>

Ilość zadeklarowanej pamięci zaczęła gwałtownie się zwiększać biggrin.gif Po zakończeniu skryptu komp musiał chwile popracować nad usunięciem z RAMu niepotrzebnych informacji.

Podsumowując
PHP automatycznie usuwa niepotrzebne instancje z pamięci (tak jak java).
zegarek84
sorki za odkopywanie staroci - ale skoro nie jest tak różowo to lepiej nie tkwić w błędzie jeśli ktoś to przeczyta...
Cytat(luinnar @ 17.02.2007, 23:50:10 ) *
Podsumowując
PHP automatycznie usuwa niepotrzebne instancje z pamięci (tak jak java).

Jakoś sobie manuala przeglądałem a potem trochu pogooglałem (tak przy okazji znowu na to forum trafiłem a szukałem czegoś podobnego ;p)...
w powyższych przykładach akurat jest usuwana zmienna/referencja (może trochę źle się wyrażę) i o wyciek przy krótko działających skryptach aż nadto nie trzeba się martwić gdyż na koniec i tak to z ramu się upłynni. Jednak jeśli skrypt ma dłużej działać lub coś napisane w stylu demona to pasuje wiedzieć kiedy jest wyciek pamięci - w duuuużym skrócie to jak się usunie "zewnętrzne" odwołanie do obiektu a wewnątrz też była jakaś referencja.... zresztą co tu dużo pisać - ciekawi tematu to odsyłam do manuala:
Garbage Collection

ps. w niektórych wersjach php zdarzają się niektóre funkcje powodujące wyciek pamięci ^^
Crozin
Cytat
w duuuurzym skrucie
Włącz sobie podświetlanie błędów w przeglądarce...
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.