2013-04-23 9 views
5

Pracuję nad aplikacją webową, która powinna być w stanie wykonywać zadania tylko za pomocą AJAX. Wydaje się działać całkiem nieźle, ale mam problem, ponieważ nie przechowuję zmiennych Session na stronie publicznej.Używanie bazy danych sesji na wielu serwerach Apache

Moja procedura logowania jest podobna do usługi iCloud. Przyjedziesz na jedną stronę z prośbą o login. Twój login jest wysyłany na serwer przy użyciu AJAX i zwraca true lub false. Jeśli jest to prawda, okno logowania znika i jesteś gotowy do pracy z aplikacjami.

enter image description here

gdy jesteś patrząc na obrazek powyżej, ujrzysz dwie zielone pola, jak dokładnie w tym samym miejscu, bez odświeżania URL lub cokolwiek. To po prostu ta sama strona.

Pudła różowe reprezentują serwery Apache, które nie zarejestrowały żadnego numeru Sessions. Moja klasa sesji została zbudowana przy użyciu pomysłu session_set_save_handler.

session_set_save_handler(
     array($this, 'open'), 
     array($this, 'close'), 
     array($this, 'read'), 
     array($this, 'write'), 
     array($this, 'destroy'), 
     array($this, 'gc') 
    ); 

ja nie potrafię wymyślić sposób dla strony publicznej z prośbą o dane na serwerach pink bez identyfikatora sesji. Czy ktokolwiek mógłby mi powiedzieć, jaki pomysł kryje się za ideą session_set_save_handler, tak jakbym miał 6 lat? Przeczytałem podręcznik PHP po szczegóły, ale to naprawdę mnie zakłopotało.

Jeśli ktoś wie, jak ta metoda komunikacji może działać poprawnie, proszę powiedz mi. Wszystkie serwery Apache są połączone za pośrednictwem sieci LAN i mogą się komunikować. Wszystkie mają także dostęp do tego samego Session Class w bibliotece dołączeń Apache.

+1

Proponuję serializacji/deserializacji '$ _SESSION' i przechowywać go w' tabeli Sessions'. – BlitZ

+0

Ale w jaki sposób serwer Apache będzie wiedział, którą sesję obsłuży podczas żądania? – Dimser

+0

Kiedy nie pomyliłem się: zapisujesz nową sesję w tabeli - w centralnym miejscu - z której każdy serwer apache może ją odczytać? – bwoebi

Odpowiedz

2

Wygląda na to, że problem, który wystąpił, można rozwiązać za pomocą sesji rozproszonych.

Korzystając z memcached, możesz podać punkt centralny dla wszystkich danych sesji, które może współdzielić dowolny podłączony serwer.

Jeśli używasz Linuksa, poniższy kod pokazuje, w jaki sposób komentowanie lokalnej obsługi sesji plików i zastąpienie jej memcache umożliwia współużytkowanie danych sesji.

~$ cat /etc/php5/apache2/php.ini | grep -i session 
    [Session] 
    ;session.save_handler = files 
    session.save_handler = memcache 
    session.save_path = "tcp://127.0.0.1:11211" 

dla dogłębnego wyjaśnienia wizyty: http://bakery.cakephp.org/articles/rynop/2010/09/10/using-memcached-to-run-your-sessions

+0

Wiesz ... Minęło trochę czasu i faktycznie znalazłem to samo rozwiązanie kilka tygodni po opublikowaniu tego pytania, ale muszę dać +1 i poprawną odpowiedź :), dzięki kolego. – Dimser

Powiązane problemy