Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Problem z wyczyszczeniem sesji

Sprawa wygląda tak, że jest jedna podstrona na której zapisuje się i są wyświetlane dane z sesji. Potem jest druga podstrona na której jest tak samo - dokładniej chodzi o formularz, taki z paroma krokami.

Założyłem sobie, że na wypełnienie jest jakiś określony czas, po czym sesja wygasa i przekierowuje przy próbie przejścia do następnego kroku, do pierwszego kroku formularza. Oto część kodu odpowiedzialna za to (pierwszy krok formularza nie ma 'view', stąd ta część warunku.

Oto część kodu, która za to odpowiada:

ini_set("session.gc_maxlifetime","60");
ini_set("session.cookie_lifetime", "60");
ini_set("session.gc_probability", "100");

if(!isset($_REQUEST[session_name()]) && empty($_GET['view']))
{
session_start();
}

if(count($_SESSION) == 0 && !empty($_GET['view']))
{
header("Location: http://www.stronka.pl/katalog/zamowprogram.php5");
}

Problem polega na tym, że tablica $_SESSION nie zeruje się cała, co jest o tyle dziwne, że jak sesja wygasa (te 60 sekund to tylko dla moich testów), to ten drugi warunek jest spelniony i przekierowanie następuje, więc teoretycznie tablica $_SESSION jest pusta. Tylko, że jak już znajdę się w pierwszym kroku i wyświetlę sobie tablicę $_SESSION to są tam dane z drugiego kroku (a przecież powinno nie być tych danych) gdy więc przejdę do drugiego kroku mam już coś wpisane, choć tak być nie powinno (jakim cudem ten warunek by się spełnił?)

Nie rozumiem co jest grane, chyba, że czegoś tutaj nie wiem.
Kuba Łopusiński

Kuba Łopusiński Ruby On Rails
developer

Temat: Problem z wyczyszczeniem sesji

Hm,
po header() z pewnością powinieneś dać jeszcze exit();

Co prawda header() przekieruje cię do nowej lokalizacji, ale cały skrypt poniżej tak czy inaczej będzie wykonany. Jeżeli więc właśnie gdzieś poniżej ustawiasz te dane sesji to właśnie dlatego będziesz je miał dalej dostępne.

pozdr.
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Problem z wyczyszczeniem sesji

Jeśli dam po header() exit to przekierowanie przestaje działać.
Kuba Łopusiński

Kuba Łopusiński Ruby On Rails
developer

Temat: Problem z wyczyszczeniem sesji

Dziwne, bo nie powinno.
(http://pl2.php.net/manual/pl/function.header.php)

Na czym polega "Przestaje działać"?
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Problem z wyczyszczeniem sesji

Nie przekierowuje tam gdzie trzeba, gdy sesja wygaśnie - zostaje na tej samej podstronce.
Kuba Łopusiński

Kuba Łopusiński Ruby On Rails
developer

Temat: Problem z wyczyszczeniem sesji

:) To nie header() przestał nagle działać, tylko warunek się nie spełnia. Skoro dajesz wcześniej session_start(), to warunek sprawdzający czy $_SESSION jest puste się nie spełni. Bo nie jest puste, masz tam już session_id przecież.

Przepraszam że tak nagle znikam, ale niestety obowiązki wzywają. Zajrzę później.

pozdr.

konto usunięte

Temat: Problem z wyczyszczeniem sesji

Rafał Grzegorek:
Jeśli dam po header() exit to przekierowanie przestaje działać.
1. Spotkałem się z różnym zachowaniem w zależności od hostingu. Generalnie pełen efekt dało się uzyskać przy:
header("location:...");
header("Connection: close");
exit;

2.mam nadzieję, że wiesz iż header() może być stosowany przed wysłaniem pierwszego znaku do przeglądarki? Często jakaś niedostrzegalna spacja jest wysyłana.. i wtedy powstają błędy.

3. $_SESSION=array(); w odpowiednim miejscu powinno załatwić sprawę.Robert B. edytował(a) ten post dnia 29.02.08 o godzinie 11:25
Dominik Bednarczyk

Dominik Bednarczyk Analityk /
Programista

Temat: Problem z wyczyszczeniem sesji

Mała rada:

zainicjuj sobie i sprawdzaj w sesji zmienną tablicową dla danych z formularza, np:

$_SESSION['form'] = array();

unikniesz przypadkowego nadpisania id sesji, gdyby ktoś przesłał je do twojego skryptu getem lub postem, ale przede wszystkim zapanujesz nad zmiennymi sesyjnymi i wprowadzisz trochę porządku.

Pozdrawiam
Marcin Tarapata

Marcin Tarapata Analityk/Tester

Temat: Problem z wyczyszczeniem sesji

2.mam nadzieję, że wiesz iż header() może być stosowany przed wysłaniem pierwszego znaku do przeglądarki? Często jakaś niedostrzegalna spacja jest wysyłana.. i wtedy powstają błędy.

To chyba można rozwiązać przez ob_start() i ob_end_flush() ???
Damian P.

Damian P. Javascript /
Frontend / PHP

Temat: Problem z wyczyszczeniem sesji

Marcin Tarapata:
2.mam nadzieję, że wiesz iż header() może być stosowany przed wysłaniem pierwszego znaku do przeglądarki? Często jakaś niedostrzegalna spacja jest wysyłana.. i wtedy powstają błędy.

To chyba można rozwiązać przez ob_start() i ob_end_flush() ???
jak najbardziej ;) wogole output buffering to bardzo przydatne "narzedzie"
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Problem z wyczyszczeniem sesji

Dominik Bednarczyk:
Mała rada:

zainicjuj sobie i sprawdzaj w sesji zmienną tablicową dla danych z formularza, np:

$_SESSION['form'] = array();

unikniesz przypadkowego nadpisania id sesji, gdyby ktoś przesłał je do twojego skryptu getem lub postem, ale przede wszystkim zapanujesz nad zmiennymi sesyjnymi i wprowadzisz trochę porządku.

Pozdrawiam

Nie rozumiem - możesz podać przykład takiego przypadkowego nadpisania?
Rafał G.

Rafał G. Programista
aplikacji
internetowych

Temat: Problem z wyczyszczeniem sesji

Robert B.:
Rafał Grzegorek:
Jeśli dam po header() exit to przekierowanie przestaje działać.
1. Spotkałem się z różnym zachowaniem w zależności od hostingu. Generalnie pełen efekt dało się uzyskać przy:
header("location:...");
header("Connection: close");
exit;

Wygląda na to, że właśnie z tym był problem i chyba teraz jest ok, ale jeszcze nie chcę mówić za bardzo do przodu. :)
Dominik Bednarczyk

Dominik Bednarczyk Analityk /
Programista

Temat: Problem z wyczyszczeniem sesji

Rafał Grzegorek:
Jeżeli udostępniasz użytkownikom zapisywanie zmiennych bezpośrednio do tablicy sesji jakichś danych z formularza (tak wnioskuję z tego co pisałeś), to nie ufaj im za bardzo :) Raczej utwórz zmienną tablicową i będziesz miał kontrolę nad tym gdzie się zapisują przesłane dane. Nawet jeżeli użytkownik prześle zmienną o nazwie "id" nie zapisze Ci się ona jako $_SESSION['id'] ale jako $_SESSION['user']['id']

Damian Pieszczyński:
Niestety używanie buforowania to bardzo zły nawyk. Stosuję go tylko w wyjątkowych sytuacjach, nigdy, gdy problem można rozwiązać odpowiednią strukturą programu. Nie wolno polecać buforowania do rozwiązywania problemów tego typu...
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Problem z wyczyszczeniem sesji

Dominik Bednarczyk:

Damian Pieszczyński:
Niestety używanie buforowania to bardzo zły nawyk. Stosuję go tylko w wyjątkowych sytuacjach, nigdy, gdy problem można rozwiązać odpowiednią strukturą programu. Nie wolno polecać buforowania do rozwiązywania problemów tego typu...

A to dlaczego? Istotnie zwiększa ono wydajność aplikacji (rzędu 50%)
Dominik Bednarczyk

Dominik Bednarczyk Analityk /
Programista

Temat: Problem z wyczyszczeniem sesji

Wojciech Sznapka:
A to dlaczego? Istotnie zwiększa ono wydajność aplikacji (rzędu 50%)

1. Jeżeli chcesz stosować buforowanie po to, żeby header() działał, bo wcześniej wysyłasz już coś do przeglądarki, to maskujesz błąd. Buforowanie należy stosować w jakimś konkretnym celu, ale na pewno nie do maskowania błędnie napisanego skryptu.

2. Wytłumacz mi w jaki sposób zwiększa wydajność i gdzie to przeczytałeś? Na chłopski rozum: jeżeli coś masz zamiar jedynie wypisać na stronie internetowej, a zamiast tego wrzucasz to do pamięci, aby później to wypisać, to po co?
Wojciech Sznapka

Wojciech Sznapka CTO @ STS Zakłady
Bukmacherskie

Temat: Problem z wyczyszczeniem sesji

Na każdym wykładzie z programowania czy inżynierii programowania pierwsze pada stwierdzenie, że bardzo czasochłonne są operacje wej/wyj. Czy strzelasz 1000 zapytaniami do bazy w ciągu jednej odsłony? Nie. Czemu? Bo lepiej zrobić 250 zapytań, które zwrócą to samo.
Chłopski rozum nie zawsze jest przydatny w informatyce ;-)

Polecam http://phplens.com/lens/php-book/optimizing-debugging-...
Dominik Bednarczyk

Dominik Bednarczyk Analityk /
Programista

Temat: Problem z wyczyszczeniem sesji

Wojciech Sznapka:
Na każdym wykładzie z programowania czy inżynierii programowania pierwsze pada stwierdzenie, że bardzo czasochłonne są operacje wej/wyj. Czy strzelasz 1000 zapytaniami do bazy w ciągu jednej odsłony? Nie. Czemu? Bo lepiej zrobić 250 zapytań, które zwrócą to samo.
Chłopski rozum nie zawsze jest przydatny w informatyce ;-)

Polecam http://phplens.com/lens/php-book/optimizing-debugging-...

Dzięki za artykuł, bardzo fajny.

1. Chłopski rozum nadal się przyda - wykonując 100 print() pewnie bardziej zmęczysz serwer niż wykonując 1 print(), ale tak jak pisałem wyżej - do tego problemu (i tamu podobnych) lepiej nie używać takiego rozwiązania. Być może do przyspieszania skryptu, ale:

2. "Use ob_start() at the beginning of your code. This gives you a 5-15% boost in speed for free on Apache." - to nie 50%, 50% dotyczyło cashe'owania htmla, a nie buforowania.

Chętnie pomyślę, gdzie w takim razie mogłoby mi sie przydać buforowanie, może mam jakiś skrypt, który przyspieszyłby gdyby go wpierw zbuforować.

Pozdrawiam.

konto usunięte

Temat: Problem z wyczyszczeniem sesji

A ja tutaj dopiszę jeszcze moje spostrzeżenie, odnośnie 'nadpisywania' sesji.
Jeśli trzymamy w zmienną tablicową, np. $_SESSION['user'] i gdzieś pojawia się zmienna $user, często zdarzało mi się, że $_SESSION['user'] pobierał wartość z $user i np. zawierał pusty string. To przydarzyło mi się w PHP5, nie pamiętam której dokładnie wersji. Ale od tamtej pory staram się nazwy dla typów tablicowych w sesji wymyślać jak najbardziej unikalne...
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: Problem z wyczyszczeniem sesji

Rafał Grzegorek:
Potem jest druga podstrona

zapisuj gdzieś sobie timestampa ostatniego ruchu usera (może być w sesji - albo w bazie) i przy każdym następnym ruchu, sprawdzaj na przykład czy aktualny_timestamp>stary_timestamp+3600
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: Problem z wyczyszczeniem sesji

Rafał Grzegorek:
Problem polega na tym, że tablica $_SESSION nie zeruje się cała, co jest o tyle dziwne, że jak sesja wygasa (te 60 sekund

... a może masz register_globals on i niektóre pola w tabeli $_SESSION[] mają takie same nazwy, jak w $_POST[]? (np. [nazwisko])

Następna dyskusja:

Szukam programisty - proble...




Wyślij zaproszenie do