jblew
30.01.2011, 22:01:02
Witam! Tworzę dość spory projekt w php. PHP pracuje tutaj nieprzerwanie (w pętli). Mam następujące pytanie: Czy stosując funkcję unset() np. do wyników pobranych z mysql, czy innych niepotrzebnych danych, pomoże znacząco zmniejszyć ilość pamięci RAM używanej przez PHP. Czy funkcja unset zwalnia zasoby zużywane przez dane?
Crozin
30.01.2011, 22:19:12
unset usuwa jedynie referencję - zwolnienie pamięci nadal pozostaje w gestii GC-a. Wszystko zależy od tego jaki masz ten kod. Jeżeli dana zmienna i tak jest usuwana przez GC lub nadpisywana to nie ma sensu używać unset(), jeżeli jednak jest ona dostępna przez długi czas można rozważyć jej usunięcie.
Jeśli Twój system jest sensownie zrobiony, to te wyniki się same usuną. Nie można bezpośrednio usunąć w PHP żadnej wartości; można co najwyżej usunąć do niej wszystkie referencje itd. i wtedy interpreter sam się zorientuje, że to już jest niepotrzebne. unset() unieważnia referencję, natomiast wartość znika dopiero, gdy liczba odnoszących się do niej referencji spadnie do 0. Problem pojawia się w przypadku tablic i obiektów - jeśli zawierają one referencje cykliczne (np. A zawiera wskazanie do B, zaś B zawiera wskazanie do A), zliczanie referencji nic nie da. PHP potrafi takie cykle rozpoznać dopiero od wersji PHP 5.3, i to w dodatku gdy sobie to włączymy.
unset() nie jest magicznym lekarstwem. W dobrze napisanym skrypcie PHP sam potrafi rozpoznać większość sytuacji, gdy pamięć trzeba zwolnić. Jawna ingerencja jest przydatna głównie przy radzeniu sobie z cyklicznymi referencjami. Zanim zabierzesz się za pracowite zwalnianie pamięci ręcznie, poświęć właśnie chwilę czasu na zrozumienie idei zarządzania pamięcią w tym języku - wtedy będziesz na pewno wiedział, kiedy unset() faktycznie Ci się przyda.