Chciałbym przedłużyć limit czasu sesji w php
Wiem, że można to zrobić, modyfikując plik php.ini. Ale nie mam do niego dostępu.
Czy można to zrobić tylko z kodem php?
Chciałbym przedłużyć limit czasu sesji w php
Wiem, że można to zrobić, modyfikując plik php.ini. Ale nie mam do niego dostępu.
Czy można to zrobić tylko z kodem php?
Odpowiedzi:
Limit czasu sesji to pojęcie, które należy zaimplementować w kodzie, jeśli chcesz uzyskać ścisłe gwarancje; To jedyny sposób, można mieć pewność, że sesja nigdy nie przetrwa po X minutach bezczynności.
Jeśli trochę złagodzenie tego wymogu jest do zaakceptowania i nie ma problemu z umieszczeniem dolnej granicy zamiast ścisłego ograniczenia czasu trwania, możesz to zrobić łatwo i bez pisania niestandardowej logiki.
Wygoda w spokojnym otoczeniu: jak i dlaczego
Jeśli Twoje sesje są zaimplementowane za pomocą plików cookie (którymi prawdopodobnie są) i jeśli klienci nie są złośliwi, możesz ustawić górną granicę czasu trwania sesji, dostosowując określone parametry. Jeśli używasz domyślnej obsługi sesji PHP z plikami cookie, ustawienie
session.gc_maxlifetime
wraz zsession_set_cookie_params
powinno działać w następujący sposób:Działa to poprzez skonfigurowanie serwera tak, aby przechowywał dane sesji przez co najmniej jedną godzinę bezczynności i poinstruowanie klientów, że powinni „zapomnieć” o swoim identyfikatorze sesji po tym samym czasie. Oba te kroki są wymagane, aby osiągnąć oczekiwany rezultat.
Jeśli nie powiesz klientom, aby zapomnieli identyfikator sesji po godzinie (lub jeśli klienci są złośliwi i zdecydują się zignorować Twoje instrukcje), będą nadal używać tego samego identyfikatora sesji, a jej efektywny czas trwania będzie niedeterministyczny. Dzieje się tak, ponieważ sesje, których czas życia wygasł po stronie serwera, nie są natychmiast zbierane, ale tylko wtedy, gdy uruchomi się sesja GC .
GC jest potencjalnie kosztownym procesem, więc zwykle prawdopodobieństwo jest raczej małe lub nawet zerowe (strona internetowa, która otrzyma ogromną liczbę trafień, prawdopodobnie całkowicie zrezygnuje z probabilistycznego GC i zaplanuje, aby miało to się odbywać w tle co X minut). W obu przypadkach (zakładając niewspółpracujących klientów) dolna granica efektywnych czasów trwania sesji będzie
session.gc_maxlifetime
, ale górna granica będzie nieprzewidywalna.Jeśli nie ustawisz
session.gc_maxlifetime
tego samego przedziału czasu, serwer może odrzucić dane sesji bezczynnych wcześniej; w takim przypadku klient, który nadal pamięta swój identyfikator sesji, przedstawi go, ale serwer nie znajdzie żadnych danych związanych z tą sesją, zachowując się tak, jakby sesja właśnie się rozpoczęła.Pewność w krytycznych środowiskach
Możesz całkowicie kontrolować rzeczy, używając niestandardowej logiki, aby również umieścić górną granicę dla braku aktywności sesji; razem z dolną granicą z góry daje to ścisłe ustawienie.
Zrób to, zapisując górną granicę wraz z resztą danych sesji:
Trwałość identyfikatora sesji
Do tej pory nie zajmowaliśmy się w ogóle dokładnymi wartościami każdego identyfikatora sesji, a jedynie wymaganiem, aby dane istniały tak długo, jak ich potrzebujemy. Pamiętaj, że w (mało prawdopodobnym) przypadku, gdy identyfikatory sesji mają dla Ciebie znaczenie, należy zadbać o ich regenerację w
session_regenerate_id
razie potrzeby.źródło
session_start()
gdy również dzwonisz (w przeciwnym razie nie ma żadnego efektu) i tylko wtedy, gdy zawsze dzwonisz do tych dwóch wcześniejsession_start
(w przeciwnym raziegc_maxlifetime
może wpłynąć na wszystkie aktualnie otwarte sesje, podczas gdysession_set_cookie_params
może wpływać tylko na nową sesję, która zaczyna się od aktualny wniosek).Jeśli używasz domyślnej obsługi sesji PHP, jedynym sposobem niezawodnej zmiany czasu trwania sesji na wszystkich platformach jest zmiana pliku php.ini . Dzieje się tak, ponieważ na niektórych platformach zbieranie elementów bezużytecznych jest implementowane za pomocą skryptu uruchamianego za każdym razem ( skrypt cron ), który czyta bezpośrednio z php.ini , a zatem wszelkie próby zmiany go w czasie wykonywania, np. Przez
ini_set()
, są zawodne i najprawdopodobniej nie zadziała.Na przykład w systemach Debian Linux wewnętrzne czyszczenie pamięci PHP jest wyłączone przez ustawienie
session.gc_probability=0
domyślne w konfiguracji i zamiast tego odbywa się za pośrednictwem /etc/cron.d/php, który działa o XX: 09 i XX: 39 (czyli co pół godziny). To zadanie crona szuka sesji starszych niż sesja.gc_maxlifetime określona w konfiguracji, a jeśli takie zostaną znalezione, są one usuwane. W konsekwencji w tych systemachini_set('session.gc_maxlifetime', ...)
jest ignorowane. To wyjaśnia również, dlaczego w tym pytaniu: sesje PHP zbyt szybko wygasały , operacja miała problemy na jednym hoście, ale problemy ustały po przełączeniu się na inny host.Tak więc, biorąc pod uwagę, że nie masz dostępu do php.ini , jeśli chcesz to zrobić przenośnie, użycie domyślnej obsługi sesji nie jest opcją. Wydaje się, że wydłużenie czasu życia plików cookie wystarczyło Twojemu hostowi, ale jeśli chcesz, aby rozwiązanie działało niezawodnie nawet przy zmianie hostów, musisz użyć innej alternatywy.
Dostępne metody alternatywne obejmują:
Ustaw inną procedurę obsługi sesji (zapisywania) w PHP, aby zapisywać sesje w innym katalogu lub w bazie danych, jak określono w PHP: Niestandardowe moduły obsługi sesji (podręcznik PHP) , aby zadanie cron do niego nie docierało i tylko w PHP ma miejsce wewnętrzne usuwanie śmieci. Ta opcja prawdopodobnie przydaje się
ini_set()
do ustawienia session.gc_maxlifetime, ale wolę po prostu zignorować parametr maxlifetime w moimgc()
wywołaniu zwrotnym i samodzielnie określić maksymalny czas życia.Całkowicie zapomnij o wewnętrznej obsłudze sesji PHP i zaimplementuj własne zarządzanie sesjami. Ta metoda ma dwie główne wady: będziesz potrzebować własnych globalnych zmiennych sesyjnych, więc tracisz przewagę
$_SESSION
superglobalnego i wymaga ona więcej kodu, przez co jest więcej okazji do błędów i luk w zabezpieczeniach. Co najważniejsze, identyfikator sesji powinien być generowany z zabezpieczonych kryptograficznie liczb losowych lub pseudolosowych, aby uniknąć przewidywalności identyfikatora sesji (prowadzącej do możliwego przechwycenia sesji), a to nie jest tak łatwe do zrobienia w przenośnym PHP. Główną zaletą jest to, że będzie działał spójnie na wszystkich platformach i masz pełną kontrolę nad kodem. Takie podejście przyjęło np. Oprogramowanie forum phpBB (przynajmniej wersja 1; nie jestem pewien co do nowszych wersji).W dokumentacji dla programu
session_set_save_handler()
znajduje się przykład (1) . Przykład jest długi, ale powielę go tutaj, z odpowiednimi modyfikacjami niezbędnymi do wydłużenia czasu trwania sesji. Zwróć uwagę na włączenie,session_set_cookie_params()
aby wydłużyć czas życia plików cookie.Podejście (2) jest bardziej skomplikowane; w zasadzie musisz samodzielnie ponownie zaimplementować wszystkie funkcje sesji. Nie będę tutaj wchodził w szczegóły.
źródło
php.ini
swoich praktycznych opcji, są poważnie ograniczone./usr/lib/php5/maxlifetime
nie obliczy wartości poniżej 24 minut. Więc nie możesz ustawić limitów czasu sesji na niższe niż to.Dodanie komentarza dla każdego, kto używa Pleska, ma problemy z którymkolwiek z powyższych, ponieważ doprowadzało mnie to do szaleństwa, ustawienie session.gc_maxlifetime z twojego skryptu PHP nie zadziała, ponieważ Plesk ma swój własny skrypt do czyszczenia pamięci uruchamiany z crona.
Użyłem rozwiązania zamieszczonego pod linkiem poniżej, aby przenieść zadanie cron z godzinnych na codzienne, aby uniknąć tego problemu, wtedy górna odpowiedź powyżej powinna działać:
https://websavers.ca/plesk-php-sessions-timing-earlier-expected
źródło
Umieść
$_SESSION['login_time'] = time();
na poprzedniej stronie uwierzytelniania. A poniżej na każdej innej stronie, na której chcesz sprawdzić limit czasu sesji.Edycja: Działa to tylko wtedy, gdy użyłeś już poprawek w innych postach lub wyłączyłeś Garbage Collection i chcesz ręcznie sprawdzić czas trwania sesji. Nie zapomnij dodać
die()
po przekierowaniu, ponieważ niektóre skrypty / roboty mogą je zignorować. Ponadto bezpośrednie niszczenie sesji za pomocąsession_destroy()
zamiast polegania na przekierowaniu może być lepszą opcją, ponownie w przypadku złośliwego klienta lub robota.źródło
Tylko powiadomienie o udostępniającym serwerze hostingowym lub dodaniu do domeny =
Aby ustawienia działały, musisz mieć inny katalog zapisywania sesji dla dodanej domeny, używając php_value session.save_path "folderA / sessionA".
Więc stwórz folder na swoim serwerze głównym, a nie na public_html i nie udostępniaj go z zewnątrz. Dla mojego cpanel / serwera działały dobrze uprawnienia do folderu 0700. Spróbuj ...
kod php =
przed session_start ();
lub
.htaccess =
Po wielu badaniach i testach działało to dobrze na współdzielonym serwerze cpanel / php7. Podziękowania dla: NoiS
źródło
Nie. Jeśli nie masz dostępu do php.ini, nie możesz zagwarantować, że zmiany przyniosą jakikolwiek skutek.
Wątpię jednak, żebyś przedłużył czas swoich sesji.
W tej chwili ma dość rozsądny limit czasu i nie ma powodów, aby go przedłużać.
źródło
SELECT id FROM gallery WHERE SortOrder > $currentsortorder LIMIT 1
Możesz przesłonić wartości w php.ini z kodu PHP za pomocą
ini_set()
.źródło
session.gc_maxlifetime
nie jest ustawieniem, które kontroluje czas trwania sesji. To może być pobity do pracy jak że jeśli ustawiszsession.gc_divisor
się1
, ale to jest po prostu straszne.gc_maxlifetime
ustawia interwał, po którym dane sesji kwalifikują się do czyszczenia pamięci - jeśli GC nastąpi po upływie tego czasu, dane sesji zostaną zniszczone (przy domyślnych ustawieniach jest to to samo, co wygaśnięcie sesji). Ale GC jest wyzwalane probabilistycznie przy każdym rozpoczęciu sesji, więc nie ma gwarancji, że sesja faktycznie wygaśnie - możesz wykreślić krzywą prawdopodobieństwa względem czasu, ale nie będzie ona wyglądać jak ściana z cegieł. To tylko wierzchołek góry lodowej; zobacz stackoverflow.com/questions/520237/…