5

ZF2 セッションとタイムアウトで、奇妙で苛立たしい動作が見られます。

セッションをセットアップするために使用するコードは次のとおりです。

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

このコードを実行すると、Cookie が作成されますが、有効期限はセッションの終わりです。

次のようにコードを変更すると:

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

Cookie が作成され、有効期限は 1 年後です。

ただし、Cookie が残っていても、セッションは 30 分ほどで期限切れになります。

私が望むのは、Cookie とセッションの両方が 1 年間持続することです。ZF2でこれを達成するにはどうすればよいですか?

4

1 に答える 1

3

問題は gc_maxlifetime オプションの処理に関係しているようです。\Zend\Session\SaveHandler\MongoDB では、この値は ini_get('session.gc_maxlifetime'); を介して PHP 構成から取得されます。

ini_set() が呼び出されている \Zend\Session\SessionManager のどこにも表示されません。

解決策は、次のいずれかを行うことだと思います。

  1. php.ini を編集し、値をグローバルに設定します
  2. .htaccess を編集し、php_value session.gc_maxlifetime を追加します
  3. \Zend\Session\SessionManager を拡張し、gc_maxlifetime オプションが指定されている場合に ini_set() を呼び出す新しいメソッドを追加します。
于 2013-05-15T16:12:35.887 に答える