Jak w PHP wygląda automatyczne zwalnianie zasobów?

0

Witam,

Nie wiem czy to nie powinno być Newbie.

Jestem doświadczonym programistom (głównie c++, troche java, troche C#). Próbuję wejść w PHP, żeby lepiej zrozumieć pewne rzeczy server side. Interesuje mnie proces zwalniania zasobów w PHP. Interesuje mnie jedna rzecz:

-zwalnianie zasów (np połączenia z bazą danych), pewnie jakieś uchwyty do plików itp.

Jak to wygląda w PHP? Wiem że ostatnio zostało dodane try..finally, ale interesuje mnie jak to się odbywało przed wprowadzeniem tego. Opcje widzę dwie:
Tworze połączenie z bazą, a następnie:

-w każdej możliwej ścieżce usuwam to połączenie w pewnym momencie (bez sensu)

-nie zwalniać połączenia z bazą. No i co wtedy? Co się dzieje gdy skrypt przestanie się wykonywać? Jaki jest good practice w takich przypadkach itp. Przecież żeby zwolnić zasób trzeba często zawołać jakąś konkretną metodę (or?) np close(), close_connections(), a nie tylko usunąć obiekt z pamięci.

Oczywiście jak ktoś ma chęć, to może to rozszerzyć o proces zwalniania pamięci dla zwykłych obiektów, ale to akurat mnie mniej interesuje - na razie zadowalam się tym, że działa.
Pozdrawiam.

0

Co do połączeń z bazą, to tutaj masz opisane co się dzieje:

http://php.net/manual/en/pdo.connections.php

0

Nikt się nie przejmuje zwalnianiem pamięci, po wykonaniu skryptu wątek jest ubijany wraz z całymi zasobami. php ma postać bezstanową ładuje się wszystko przed wykonaniem skryptu i kasuje po. Inaczej ma się sprawa w środowiskach takich jak chociażby .net, ale ty się pytałeś o php :)

0

Nie ma potrzeby ręcznego rozłączania się z bazą.

A GC przeleci pamięć dopiero w momencie gdy skrypt miałby się wywalić z powodu jej przepełnienia - więc nawet jak wcześniej będziesz się starał usuwać dane z pamięci - to i tak nie będzie żadnej różnicy.

unsetuj jedynie to, co zostaje Ci w głównym scopie/globalnie dostępne, a czego nie potrzebujesz, żeby GC miał co usuwać w razie czego, ale generalnie jak dobrze programujesz = nie robisz wszystkiego w głównym scopie, tylko dostajesz zwrotki potrzebnych danych z funkcji - to w głównym scopie i tak nie będzie co unsetować.

tl;dr - w dobrze napisanym kodzie nie ma sensu bawić się w unsetowanie i podobne, bo GC i tak zadziała dopiero przy braku pamięci, a jak @mr_jaro napisał - po zakończeniu żądania i tak wszystko zniknie, bo php jest technologią do pisania bezstanowych aplikacji</del>

0

Trochę mi to rozjaśniło sprawę, ale ciągle widzę dwie kwestie, których nie rozumiem.

Przypadek :
-potrzebuje odczytać coś z bazy (krótki strzał) i dalej już bazy nie potrzebuję, natomiast skrypt się przetwarza, bo robię n różnych rzeczy, pomijając czy trwa to długo czy krótko, mogę chcieć zwolnić połączenie, bo w tym samym czasie ten sam skrypt może się wywołać n razy przez inne requesty. No to wygląda na to, że nie ma gwarancji że zwolnię połączenie? Przypisanie NULL nie gwarantuje że połączenie zostanie zamknięte, tak samo wyjście poza zasięg nie gwarantuje tego? Dobrze myślę?
-czy w ww przypadku zakończenie przetwarzania skryptu jest gwarancją zwolnienia zasobów, czy też tylko gdy zostało mało "pamięci" (gdy inne requesty zjadły zasoby serwera)?

0

Na każdym serwerze php jest ustawiana wartość maksymalnego czasu w jakim może wykonać się skrypt. php nie zostało stworzone do wykonywania milionów operacji przez kilka godzin, dlatego są to odosobnione przypadki najczęściej w środowisku dev lub zamkniętym dostępnym tylko dla upoważnionych osób:) Jedyne co jest dopuszczalne w stronach opartych na php względem dłuższego wykonywania czasu to upload pliku, ale tak czy tak maksymalny czas wykonywania skryptu ustawia się na max kilka minut. Generowanie strony nie powinno trwac dłużej niż kilka dziesiątych sekundy do max kilku sekund ( w krytycznych przypadkach) dlatego nie ma potrzeby zwalniania zasobów wcześniej.

Tak, zakończenie wykonywania się skryptu, sypnięcie fatal errorem czy chociażby opisane wyżej przekroczenie czasu jest gwarantem zwolnienia wszystkich zasobów wykonywanych w tym żądaniu.

0

Wszystko jasne. Wielkie dzięki ;)

0

Sprostowanie, bo zdaje się pokręciło mi się z jakimś innym językiem, albo złe źródło informacji. PHP zwolni pamięć zajmowaną przez dane, do których już nie można się dostać, czyli np. porzucone w funkcji zmienne.

Manual:
https://secure.php.net/manual/en/internals2.variables.intro.php

1 użytkowników online, w tym zalogowanych: 0, gości: 1