DarkAbso
25.06.2015, 21:02:33
Pewnie zadam dla Was proste pytanie, ale dzisiaj nadeszła mnie delikatna rozkmina na temat życia obiektu w PHP i może ktoś da mi odpowiedź. Przypuśćmy, iż użytkownik wysyła zapytanie do serwera i w tym momencie odzywa się interpreter PHP. Tworzone są obiekty, referencje do nich zaczynają przeprowadzać swoje operacje, a użytkownik po chwili dostaje odpowiedź. W tym momencie nie ma już referencji do obiektu i "odśmiecacz" czyści stos. I teraz się zastanawiam, czy istnieje możliwość, aby przedłużyć życie takiego obiektu? Trochę bez sensu go usuwać na dany moment, jeżeli wiem, iż użytkownik zaraz będzie z niego korzystał ponownie. Największy problem byłby po stronie interpretera PHP, ponieważ musiał by dostawać inofrmację kiedy taki obiekt ma iść do destrukcji. To są moje delikatne rozkminy, a w sieci niewiele znalazłem na ten temat.
poczekaj do wersji 7
DarkAbso
25.06.2015, 21:28:34
To widzę, że grube postępy zrobią w tym kierunku. Zanim będzie wersja 7 i się ustabilizuje to pewnie minie kilka lat, ale jak widzę to nie mam wyjścia i muszę poczekać.
aniolekx
26.06.2015, 07:14:26
Xelah
26.06.2015, 07:38:40
Nie widziałem niczego związanego z tym tematem w PHP 7 (cheba, że źle szukam).
I wydaje mi się, że takiego czegoś niegdy w PHP nie będzie, bo to oznaczało by, że PHP, jako język, musi być świadomy istnienia sesji - i to na poziomie GC. Sesja nie jest core w PHP. To tylko extension. Czyli już web server albo core PHP musiałby implementować jakiś rodzaj sesji, żeby połączyć między sobą dwa requesty. Do tego pojawiłby się problem kiedy w ogóle te obiekty usuwać? Nigdy?
Jakoś czarno to widzę.
Jeśli rzeczywiście konstukcja obiektu jest tak kosztowna, że nie chcesz tego robić przy każdym rządaniu, to są inne metody (memcache, redis i tym podobne).
DarkAbso
26.06.2015, 08:38:55
@Xelah dokładnie to samo pisałem w pierwszym poście, mówię o destrukcji obiektu. W tym wypadku interpreter rzeczywiście miałby problem. Co do memcache to już kiedyś czytałem o tym, ale nie testowałem i chyba pora aby to zrobić.
Xelah
26.06.2015, 08:41:38
@DarkAbso Zasugerowałem sie Twoim drugim postem i postem com-a. PHP w ogóle nie idzie w tym kierunku, bo to nie jest coś, to można rozwiązać na poziomie języka.
Crozin
26.06.2015, 08:44:59
1. Nie da się. Tak już działa PHP, że po zakończeniu obsługi żądania kończy w ogóle swój żywot.
2. Ale przecież podstawowy mechanizm obsługi sesji powinien Cię uratować? Pamiętaj tylko by Twoje obiekty były serializowalne - Google: PHP serializ
tak ale jeśli dostanie vm to można by zrobić gc jak w javie np

zamiast zliczania referencji
Xelah
27.06.2015, 14:31:57
Tylko to chyba nie ma za wiele wspólnego z samym GC. Z javą miałem do czynienia ostatnio ponad 10 lat temu, więc mogę się mylić, ale GC w Javie też usuwa obiekty, dla których nie istnieją referencje. Robi to nie w oparciu o licznik a poprzez skanowanie stosu, ale efekt końcowy jest identyczny.
Fakt, że Java może zachować stany pomiędzy requestami nie wynika ze sposobu działania GC a z tego, że ma VM, w którym działają na przykład servlet czy beans. Sama VM czy GC tego nie dają
vokiel
27.06.2015, 16:50:58
Tylko w czym problem? W tym, że PHP stworzy obiekt Request potem po zakończeniu żądania go usunie, a przy następnym stworzy nowy, prawie taki sam (być może bardzo, bardzo podobny)?
Tak to działa i wynika bezpośrednio z zasady bezstanowości HTTP. IMHO to nawet zaleta - wszystko jest czyszczone po zakończeniu żądania, następne zaczyna z czystą pamięcią, jedyny minus to taki, że podobne obiekty są ciągle tworzone i usuwane.
DarkAbso
29.06.2015, 08:42:21
@vokiel drugi minus według mnie to taki, iż nie posiadamy stanu obiektu po zakończonym żądaniu. Jeżeli chcieli byśmy pracować dalej na wynikach tego obiektu to musimy je gdzieś przechować, bo obiekt po prostu umiera.
Pyton_000
29.06.2015, 09:05:35
Taka jest specyfika PHP, jak chcesz to możesz przecież serwializować obiekt i dalej na nim pracować.
DarkAbso
29.06.2015, 19:59:51
Właśnie się pochyliłem nad serializowaniem obiektów i tak jak mówiliście to powinno załatwić sprawę w skrajnych przypadkach. Dziękuję wszystkim za odpowiedź.
grzemach
30.06.2015, 21:12:56
Nie prościej zrobić program C/C++ który będzie robił za serwer i on przejmie całe generowanie odpowiedzi, PHP będzie robiło za PROXY. W takiej sytuacji aplikacja może działać cały czas.
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.