2013-05-15 30 views
5

Tôi thấy một số hành vi kỳ lạ và bực dọc với phiên ZF2 và thời gian chờ.Zend Session SessionManager và cookie_lifetime

Dưới đây là đoạn code tôi sử dụng để thiết lập phiên:

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

Khi tôi thực thi mã này, cookie được tạo ra nhưng khi hết thời hạn là cuối phiên.

Nếu tôi thay đổi mã như thế này:

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

cookie được tạo ra và kết thúc thời hạn là một năm kể từ bây giờ.

Tuy nhiên, phiên vẫn hết hạn sau 30 phút hoặc lâu hơn, mặc dù cookie vẫn còn.

Điều tôi muốn là cho cả cookie và phiên tồn tại trong một năm. Làm thế nào để thực hiện điều này trong ZF2?

+3

Sử dụng '\ Zend \ Session \ Config \ SessionConfig', không phải' StandardConfig' – Crisp

+0

Khi tôi sử dụng SessionConfig với các tùy chọn tương tự như trên, cookie PHPSESSID không được ghi. Tôi đang thiếu gì? – ebeyrent

+0

Các tùy chọn ở trên cho biết phiên 'tên' của' mydomain'? – Crisp

Trả lời

3

Có vẻ như vấn đề liên quan đến việc xử lý tùy chọn gc_maxlifetime. Trong \ Zend \ Session \ SaveHandler \ MongoDB, giá trị này được lấy từ cấu hình PHP, thông qua ini_get ('session.gc_maxlifetime');

Tôi không thấy bất kỳ đâu trong \ Zend \ Session \ SessionManager trong đó ini_set() đang được gọi.

Các giải pháp, tôi nghĩ, là để làm một trong những điều sau đây:

  1. Sửa php.ini và thiết lập giá trị toàn cầu
  2. Sửa .htaccess và thêm session.gc_maxlifetime php_value
  3. Mở rộng \ Zend \ Session \ SessionManager và thêm một phương thức mới gọi ini_set() nếu tùy chọn gc_maxlifetime được cung cấp.
+4

'ini_set' được gọi bởi lớp' SessionConfig', không cần chỉnh sửa gì cả, op ​​chỉ cần sử dụng đúng lớp. – Crisp

Các vấn đề liên quan