Yii Framework Forum: CDbHttpSession i CController redirect() - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

CDbHttpSession i CController redirect() nie zawsze zapisuje dane sesji gdy wywołuję redirect() Rate Topic: -----

#1 User is offline   tybetx 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 01-March 12

Posted 24 March 2012 - 05:26 AM

Witam,
mam problem z CDbHttpSession . Dane sesji nie zawsze są zapisywane do bazy jeśli wywołuję redirect() lub refresh().
Muszę bezpośrednio wywołać
Yii::app()->session->close();
przed redirect() lub refresh().
Nawet
Yii::app()->onEndRequest = array(Yii::app()->session, 'close');
nie pomaga.
Czy ktoś zna ten problem? Jeśli używam sesji opartej na plikach, wszystko działa poprawnie.
0

#2 User is offline   aquasite.pl 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 18
  • Joined: 20-May 11

Posted 25 March 2012 - 07:50 AM

Tyle znalazłem:
http://code.google.c.../detail?id=2406

Problem chyba taki sam.
Posted Image
Agencja interaktywna Itzen.pl
Informatyczne rozwiązania dla firm.
Programowanie, Pozycjonowanie, Testy A/B, Reklama.
0

#3 User is offline   tybetx 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 5
  • Joined: 01-March 12

Posted 25 March 2012 - 05:25 PM

Nadpisałem redirect() w Controller i jest dobrze:
    
public function redirect($url, $terminate=true, $statusCode=302)
{
    if (Yii::app()->session->useCustomStorage) {
        Yii::app()->session->close();
    }
    parent::redirect($url, $terminate, $statusCode);
}


Tylko nie rozumiem dlaczego to nie zadziałało:
Yii::app()->onEndRequest = array(Yii::app()->session, 'close');

0

#4 User is offline   redguy 

  • Master Member
  • PipPipPipPip
  • Yii
  • Group: Members
  • Posts: 809
  • Joined: 02-July 10
  • Location:Central Poland

Posted 28 March 2012 - 10:00 AM

używasz "useCustomStorage", wiec zakladam, ze trzymasz sesje w bazie lub innym keszu zamiast standardowych plikow. problom moze polegac na tym, ze o ile standardowe pliki sa blokowane na czas procesowania skryptu (pomiedzy session::open i session::close), to inne mechanizmy czesto tego nie maja (np. odczyt z bazy to select, zapis - update, ale pomiedzy select a update inne procesy php moga sie odwolywac do rekordu sesji, nie jest on zablokowany). jesli teraz jeden proces php wygeneruje redirect (header Location) to przegladarka moze odwolac sie do tego adresu zanim jeszcze obsluga poprzedniego requestu sie zakonczy w skrypcie php. serwer www obsluzy ten kolejny request za pomoca nowego procesu php, ktory pobierze dane sesji zanim jeszcze poprzedni proces je zapisze. W przypadku obslugi sesji za pomoca plikow ten drugi request zawisl by do czasu zwolnienia blokady na pliku, czyli do czasu az pierwszy proces wykonalby session::close na koncu swojej pracy. dlatego tez reczne wywolanie session::close przed redirectem (co powoduje zapisanie danych sesji) rozwiazuje problem...

zagadnienie blokady zasobow w przypadku sesji to dosc znany problem - z jednej strony uniemozliwia rownolegle procesowanie requestow od tego samego uzytkownika (co jednak zwykle nie jest potrzebne) przy tym rozwiazuje problem wielodostepu do sesji, z drugiej - jest mniej wydajne (nie ma wielodostepu, mechanizm flock do najszybszych nie nalezy, itp..)
red
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users