![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 10 Dołączył: 17.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
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.
|
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
poczekaj do wersji 7
![]() |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 10 Dołączył: 17.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
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ć.
![]() |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 340 Pomógł: 46 Dołączył: 31.07.2009 Skąd: A Ostrzeżenie: (0%) ![]() ![]() |
mozesz uzyc np tego: http://php.net/manual/en/memcached.set.php
|
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 139 Pomógł: 24 Dołączył: 12.05.2013 Skąd: Hamburg Ostrzeżenie: (0%) ![]() ![]() |
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). |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 10 Dołączył: 17.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
@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ć.
|
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 139 Pomógł: 24 Dołączył: 12.05.2013 Skąd: Hamburg Ostrzeżenie: (0%) ![]() ![]() |
@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.
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 3 034 Pomógł: 366 Dołączył: 24.05.2012 Ostrzeżenie: (0%) ![]() ![]() |
tak ale jeśli dostanie vm to można by zrobić gc jak w javie np
![]() Ten post edytował com 26.06.2015, 20:49:01 |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 139 Pomógł: 24 Dołączył: 12.05.2013 Skąd: Hamburg Ostrzeżenie: (0%) ![]() ![]() |
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ą ![]() |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 2 592 Pomógł: 445 Dołączył: 12.03.2007 Ostrzeżenie: (0%) ![]() ![]() |
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. -------------------- |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 10 Dołączył: 17.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
@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.
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 8 068 Pomógł: 1414 Dołączył: 26.10.2005 Ostrzeżenie: (0%) ![]() ![]() |
Taka jest specyfika PHP, jak chcesz to możesz przecież serwializować obiekt i dalej na nim pracować.
|
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 60 Pomógł: 10 Dołączył: 17.11.2011 Ostrzeżenie: (0%) ![]() ![]() |
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ź.
|
|
|
![]()
Post
#15
|
|
Grupa: Zarejestrowani Postów: 121 Pomógł: 4 Dołączył: 9.06.2007 Skąd: Kielce Ostrzeżenie: (0%) ![]() ![]() |
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.
-------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 16.07.2025 - 09:57 |