Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] długość życia zmeinnej sesji
Forum PHP.pl > Forum > Przedszkole
pepro
To mój pierwszy post na tym forum, więc witam wszystkich serdecznie. Nie jestem programistą a jedynie poszukiwaczem rozwiązania problemów więc proszę o wyrozumiałość oraz nie odsyłania do manuali, od tego zawsze zaczynam i staram się rozwiązać.
Mój problem polega na tym, że w żaden sposób nie potrafię ustawić długości życia zmiennej sesji.
Otóż ktoś, kiedyś napisał nam do warsztatu prostą 'aplikację' w php do zarządzania naszymi klientami (historia napraw, gwarancje i inne nieskomplikowane historie). Są tam do wypełniania różne pola. Po zalogowaniu się trzeba coś klikać bo jeśli tego nie zrobisz przerzuca do strony logowania. Jak się doczytałem czas życia zmiennej jest ustawiony globalnie w php.ini i jest to 1440s, czyli klasyczne 24min. Problem u nas polega na tym, że musimy zawsze pamiętać by sobie coś kliknąć aby sesja żyła. Pozostawienie komputera z częściowym wpisem i odejście powoduje, że wszystko co wpisane w pola do tego czasu idzie w kosmos przy naciśnięciu zapisz, bo wskakuje strona logowania.
Pytanie: Jak czas bezczynności czy jak to nazwać, aby sesja trwała powiedzmy 2h lub dłużej.
Na tym forum znalazłem rozwiązanie problemu przy użyciu
  1. ini_set('session.gc_maxlifetime', 7200);

Niestety jednak to nie działa. Poniżej wkleję zawartość plików (jak mi się wydaje) odpowiedzialnych za to i serdecznie Was proszę podpowiedź co jest nie tak:

index.php
  1. <? include ('conf/auth.php')?>
  2. <html>
  3.  
  4. <head>
  5. [...]

conf/auth.php
  1. <? include ('conf/functions.php');
  2. init_session();
  3. if(!isset($_SESSION['validadmin']))
  4. {
  5. header("Refresh: 0; url=login.php");
  6. exit();
  7. }
  8. ?>


conf/functions.php
  1. <?php
  2. include('config.php');
  3.  
  4. function init_session()
  5. {
  6. session_set_cookie_params(50400,"/",$_SERVER['SERVER_NAME']);
  7. ini_set('session.gc_maxlifetime', 7200);
  8. if(!isset($_SESSION['mesg_type']))
  9. $_SESSION['mesg_type']='err';
  10. }
  11. $data = date('d-m-Y');
  12. $godz = date('H:i');
  13. ?>

Linijkę 8 (czyli ini_set('session.gc_maxlifetime', 7200)) dopisałem sam bo tego nie było.

Jest jeszcze plik config.php, ale tam są tylko informacje o bazie (host, user, baza).

Cały skrypt działa prawidłowo poza tym, że święte 24min bezczynności i logowanie ponowne. Nie mam możliwości skontaktowania się z autorem. Zieniałem do testów wartość 7200 na różne, nawet 60 tak by przetestować czy po minucie wywali, niestety wywala i nie mam bladego pojęcia co i jak zrbić.
Lorum3
Najlepiej będzie wejść w plik konfiguracyjny PHP na serwerze ( php.ini) i tam edytować odpowiednią linijkę.
pepro
Nie napisałem tego wcześniej. Edycja php.ini i zmiana czasu życia nie wchodzi w grę. Używamy hostingu zewnętrznego. Gdybyśmy mieli własny serwer to pewnie dawno byśmy tak zrobili.
viking
Sesje to akurat taka rzecz która zupełnie nic wspólnego nie ma z konfiguracją bazową serwera (chyba że mowa o replikacji co akurat nie sądzę żeby wchodziło w grę w tym przypadku). Możesz własny wrapper napisać który w żaden sposób nie będzie związany z funkcjami PHP (set_cookie, session*).
redeemer
Zrób "pukanie" co jakiś czas ajaxem w tle.
pepro
Cytat(redeemer @ 20.09.2012, 19:53:04 ) *
Zrób "pukanie" co jakiś czas ajaxem w tle.

redeemer Czy mógłbyś mi napisać jak to zrobić? O ajaxie tylko słyszałem i bardziej kojarzy mi się z płynem do mycia naczyń niż z językiem programowania oneeyedsmiley02.png
Z góry serdecznie dziękuję
redeemer
Wstawiasz kod javascript na stronę, który co jakiś interwał czasowy będzie w tle wykonywał rządanie do Twojego serwera. Zwykle używa się tego do pobierania i wyświetlania danych bez potrzeby przeładowania całej strony, jednak w Twoim wypadku nic nie będziesz pobierał ani wyświetlał tylko podtrzymywał sesję (zadziała to tak jakbyś odświeżył stronę, ale bez jej odświeżania).



pepro
Na pewno to zadziała skoro tak twierdzisz.
Już widzę uśmiechnięte twarze ludzi, których nie przeniesie na strone logowania. Jest tylko jedna kwestia, nie mam pojęcia jak to zrobić i o co pytać wujka googla. Proszę więc o jakiś przykład kodu, który powinienem wkleić. Jak nadmieniałem nie jestem programistą i na 99% nigdy nie będę (choć żałuje bo to fajna przygoda).
Podrzuć proszę przykład.
untorched
Coś co powinno działać, choć nie testowałem wink.gif
  1. <html>
  2. <head>
  3. <script src="http://code.jquery.com/jquery-latest.js">
  4. <script type="text/javascript">
  5.  
  6. setInterval("pagePing();",5000);
  7.  
  8. function pagePing(){
  9. $.ajax(
  10. {
  11. url: location.href
  12. }
  13. );
  14. }
  15. </script>
  16. </head>
  17. <body>
viking
W sumie to bzdura wielka "pukać" ajaxem. Gdzie masz wykupiony serwer (Polska, USA, jakaś inna Malezja)? Zobacz po odsłonie w przeglądarce jakie cookie się zapisało.

  1. session_set_cookie_params(50400,"/",$_SERVER['SERVER_NAME']);

To ustawia czas życia sesji na 14h.
redeemer
Dlaczego bzdura wielka? Rozwiązanie ma tą przewagę nad ustawieniem 14h, że gdy użytkownik się nie wyloguje z systemu, ale zamknie przeglądarkę i rano ktoś (może nawet inny pracownik) usiądzie na to samo stanowisko, będzie musiał się zalogować do systemu ponownie. W przypadku, gdy użyjemy session_set_cookie_params(50400...) będzie zalogowany jako poprzedni użytkownik.

Dodatkowo, ale to już zależy od budowy samej aplikacji, może to się wiązać z większym nakładem pracy, bo trzeba to ustawiać w każdym requescie przed session_start().
viking
Tyle lat sesje działały w ten sposób i było oki. Równie dobrze można powiedzieć że jak się nie wyloguję z poczty to ktoś zacznie moje maile czytać. Jeśli strona składa się z 20 podstron, każda luzem też będzie trzeba twój kod wrzucić to na początek każdego pliku więc nie rozumiem argumentu o budowie. A nie dość że obciążasz stronę jquery (po co cała biblioteka żeby taką głupotę zrobić?) to jeszcze ślesz zbędne requesty ajaxowe.
redeemer
Nie napisałem nic o jquery, a jeden request na 10 min to nie jest żaden problem, tym bardziej, że po stronie serwera nie ma potrzeby ładować całej aplikacji a tylko mechanizm sesyjny. Co do nakładu pracy - to racja, jeszcze jestem przed poranną kawą i wymyśliłem sobie, że wszyscy korzystają z szablonów z rozdzieleniem headera, footera itd wink.gif

EDIT: No i rozwiązanie z pukaniem ma jeszcze tą wadę, że w przypadku czasowego braku dostępu do internetu, może to nie podtrzymać sesji.
viking
A sorki, nie ty podałeś ten kod. Ale faktem że było osadzone jquery. Wkurza mnie to po prostu bo każdy wannabe webmaster wrzuca, oczywiście synchronicznie, ile wlezie skryptów na stronę bez zastanowienia jakie to niesie za sobą konsekwencje. I kiedy na laptopie z siecią 3G później się czeka na wczytanie każdej po 20 sekund szlag człowieka bierze. Tutaj też można się zastanowić nad różnymi przypadkami np że pracownik serwisu pracuje zdalnie na tablecie albo komórce i co wtedy? Żądanie nie będzie mogło być zrealizowane i znowu nastąpi wylogowanie po określonym czasie. Jest jakiś problem z czasem życia sesji i do tego należało by dojść bo żaden AJAX nie jest potrzebny. A skoro mowa o firmie i aplikacji wewnętrznej dla pracowników, a autor nie ma pojęcia o programowaniu, to może warto się zastanowić czy nie zapłacić komuś za zrobienie tego.
pepro
No nic. Po wklejeniu w head kodu javascript, który podesłał untorched oraz wcześniej używanego wymuszania życia sesji przy użyciu ini_set nie ma żadnych zmian. 24min bezczynności i wskakuje strona logowania.
Czy możecie zerknąc na mój pierwszy post? Może tam jest jakiś błąd. Co dziwne po praniu czasu komendą
  1. ini_get('session.gc_maxlifetime');

listuje zadeklarowany czas 7200 a jak wywale wpis
  1. ini_set('session.gc_maxlifetime', 50400);

ini_get pokazuje 1440 czyli to co ustawione w php.ini

Może mi ktoś wytłumaczyć jak mam rozumieć takie cuda?
viking
Spróbuj zmienić przez http://www.php.net/manual/en/session.confi...ssion.save-path umiejscowienie sesji. Jak nie pomoże sprawdź w cookie jaki jest czas ustawiany i go podaj. Sprawdź nagłówki (firebug albo inna konsola). Jaki system plików na którym to testujesz?
pepro
To pomogło:
  1. session_save_path('sciezka_do_pliku');


Dzieki wszystkim.
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.