2013-05-15 9 views
5

Widzę dziwne i frustrujące zachowanie podczas sesji ZF2 i limitów czasu.Zend Session SessionManager i cookie_lifetime

Oto kod używam skonfigurować sesję:

$sessionConfig = new \Zend\Session\Config\StandardConfig(); 
    $sessionConfig->setOptions(array(
     'cache_expire' => 525949, 
     'cookie_domain' => 'mydomain.com', 
     'cookie_lifetime' => 31536000, 
     'cookie_path' => '/', 
     'cookie_secure' => TRUE, 
     'gc_maxlifetime' => 31536000, 
     'name' => 'mydomain', 
     'remember_me_seconds' => 31536000, 
     'use_cookies' => TRUE, 
    )); 

    $sessionManager = new \Zend\Session\SessionManager($sessionConfig); 
    $sessionManager->rememberMe(31536000); 
    $sessionManager->setSaveHandler(new \Zend\Session\SaveHandler\MongoDB($mongo, $options); 
    $session = new \Zend\Session\Container('MY_SESSION', $sessionManager); 

Kiedy wykonać ten kod, ciasteczko zostanie utworzone, ale wydech jest koniec sesji.

Gdybym zmienić kod tak:

$sessionManager = new \Zend\Session\SessionManager(); 
    $sessionManager->rememberMe(31536000); 
    $sessionManager->setConfig($sessionConfig); 
    $session = new \Zend\Session\Container('MY_SESSION', $sessionManager); 

ciasteczko zostanie utworzone, a wydech jest rok od teraz.

Jednak sesja nadal wygasa po około 30 minutach, mimo że plik cookie pozostaje.

Czego chcę, aby plik cookie i sesja przetrwały przez rok. Jak to zrobić w ZF2?

+3

Użyj '\ Zend \ Session \ Config \ SessionConfig', nie' StandardConfig' – Crisp

+0

Gdy używam SessionConfig z tych samych opcji jak wyżej, cookie PHPSESSID nie uzyskać napisane. czego mi brakuje? – ebeyrent

+0

Powyższe opcje wskazują sesję 'name' of' mydomain'? – Crisp

Odpowiedz

3

Wygląda na to, że problem związany jest z obsługą opcji gc_maxlifetime. W \ Zend \ Session \ SaveHandler \ MongoDB ta wartość jest pobierana z konfiguracji PHP, poprzez ini_get ("session.gc_maxlifetime");

Nie widzę nigdzie w \ Zend \ Session \ SessionManager, gdzie wywoływana jest funkcja ini_set().

Rozwiązaniem, jak sądzę, jest zrobić jedną z następujących czynności:

  1. Edycja php.ini i ustaw wartość globalnie
  2. Edycja .htaccess i dodać php_value session.gc_maxlifetime
  3. przedłużyć \ Zend \ Session \ SessionManager i dodaj nową metodę, która wywołuje ini_set(), jeśli podano opcję gc_maxlifetime.
+4

'ini_set' jest wywoływane przez klasę' SessionConfig', nie ma potrzeby edytowania czegokolwiek, po prostu musi używać poprawnej klasy. – Crisp