2013-05-15 10 views
5

Sto osservando un comportamento strano e frustrante con sessioni ZF2 e timeout.Zend Session SessionManager e cookie_lifetime

Ecco il codice che uso per impostare la sessione:

$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); 

Quando eseguo questo codice, il cookie viene creato, ma la scadenza è fine della sessione.

Se cambio il codice come questo:

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

il cookie viene creato e la scadenza è un anno da ora.

Tuttavia, la sessione scade ancora dopo 30 minuti circa, anche se il cookie rimane.

Quello che voglio è che il cookie e la sessione persistano per un anno. Come posso realizzare questo in ZF2?

+3

Usa '\ Zend \ Session \ Config \ SessionConfig', non' StandardConfig' – Crisp

+0

Quando uso SessionConfig con le stesse opzioni di cui sopra, il cookie PHPSESSID non ottiene scritto. Cosa mi manca? – ebeyrent

+0

Le opzioni sopra indicano un 'nome' di sessione di' mydomain'? – Crisp

risposta

3

Sembra che il problema abbia a che fare con la gestione dell'opzione gc_maxlifetime. In \ Zend \ Session \ SaveHandler \ MongoDB, questo valore è preso dalla configurazione di PHP, tramite ini_get ('session.gc_maxlifetime');

Non vedo da nessuna parte in \ Zend \ Session \ SessionManager dove viene chiamato ini_set().

La soluzione, penso, è quello di fare una delle seguenti:

  1. Modifica php.ini e impostare il valore a livello globale
  2. Modifica .htaccess e aggiungere session.gc_maxlifetime php_value
  3. Estendere \ Zend \ Session \ SessionManager e aggiunge un nuovo metodo che chiama ini_set() se viene fornita l'opzione gc_maxlifetime.
+4

'ini_set' è chiamato dalla classe' SessionConfig', non c'è bisogno di modificare nulla, op ha solo bisogno di usare la classe corretta. – Crisp