Maciej Filipiak

Maciej Filipiak właściciel, VizMedia

Temat: przestrzeń nazw sesji i przepływ informacji miedzy...

Witam

Mam w swojej aplikacji parę kontrolerów
w każdym z nich tworzę sesje:

$mojaSesja = new Zend_Session_Namespace('nazwaPrzestrzeni');

Jeżeli w jednym kontrolerze ustalę jakąś zmienną np:

$mojaSesja->zmienna = 101010;

Nie widzę jej w pozostałych kontrolerach.
- dlaczego ? jak to naprawić ?

---

analogiczne pytanie:
jak będąc w jednym kontrolerze zrobić destroy na sesjach w każdym z kontrolerów ?

Zend_Session::destroy(true);

działa tylko w tym kontrolerze, w którym wywołam destroy.
Jak ubić wszystkie sesje ?
(albo, żeby te wszystkie były jedną)
Rafał Gałka

Rafał Gałka Senior Software
Engineer

Temat: przestrzeń nazw sesji i przepływ informacji miedzy...

Witam,

Zastosuj w kontrolerach ten sam namespace:

class TestController extends Zend_Controller_Action
{
protected $_testSession;

public function init()
{
$this->_testSession = new Zend_Session_Namespace('testNamespace');
}
}

class Test2Controller extends Zend_Controller_Action
{
protected $_test2Session;

public function init()
{
$this->_test2Session = new Zend_Session_Namespace('testNamespace');
}
}

lub utwórz obiekt reprezentujący namespace użyty w innym kontrolerze:

class TestController extends Zend_Controller_Action
{
protected $_testSession;

public function init()
{
$this->_testSession = new Zend_Session_Namespace('testNamespace');
}
}

class Test2Controller extends Zend_Controller_Action
{
protected $_testSession;
protected $_test2Session;

public function init()
{
$this->_testSession = new Zend_Session_Namespace('testNamespace');
$this->_test2Session = new Zend_Session_Namespace('test2Namespace');
}
}

---

Zend_Session::destroy(true); niszczy dane w sesji ($_SESSION) ale nie usuwa ich obiektowych reprezentacji czyli obiektów Zend_Session_Namespace. Dodanie true jako drugiego argumentu:

Zend_Session::destroy(true, true);

zabezpiecza resztę kodu przed powołaniem kolejnych obiektów Zend_Session_Namespace.

Jeśli chcesz mieć pewność, że dalszy kod nie odczyta danych sesyjnych zgromadzonych w ich obiektowych reprezentacjach możesz wymusić usunięcie wszystkich obiektów Zend_Session_Namespace, co możesz wykonać tuż przed wywołaniem destroy();

foreach (Zend_Session::getIterator() as $namespace) {
Zend_Session::namespaceUnset($namespace);
}
Zend_Session::destroy(true, true);

Musisz jednak pamiętać, że w PHP5 istnieją wskaźniki a namespaceUnset() nie przeprowadza operacji głębokiego usuwania zmiennych, co za tym idzie jeśli przechowasz w sesji obiekt do którego posiadasz wskaźnik to namespaceUnset usunie tablicę w sesji ale obiekt znajdujący się w niej nadal będzie dostępny poprzez istniejącą referencję.

--

PS: Istnieje tylko jedna sesja ;) Obiekty Zend_Session_Namespace to tylko obiektowe reprezentacje danych należących do tej samej sesji.Rafał Gałka edytował(a) ten post dnia 29.06.08 o godzinie 18:21
Maciej Filipiak

Maciej Filipiak właściciel, VizMedia

Temat: przestrzeń nazw sesji i przepływ informacji miedzy...

dzięki Rafale - ale problem leży chyba w konfiguracji środowiska (?)

wszędzie używam jednej nazwy przestrzeni nazw

Zauważyłem w międzyczasie, że ta sama aplikacja na jednej maszynie komunikuje sie miedzy kontrolerami - problemu nie ma.
Po zainstalowaniu u klienta problem jest.

Wszystko tak napisałem jak podajesz - z tą różnicą, że zamiast

$this->_testSession przypisuje prezentacje danych bezpośrednio do zmiennej

$testSession = new Zend_Session_Namespace(..)

Ponieważ na jednej maszynie działa, na drugiej nie - wnioskuje, że problem w konfiguracji "czegoś" - nawet nie wiem czego ...

Spróbuje jeszcze z drugim 'true' w destroy, ale nie rozwiąże to komunikacji przez zmienne przed destroy()Maciej Filipiak edytował(a) ten post dnia 30.06.08 o godzinie 19:32



Wyślij zaproszenie do