私は、ログインしているユーザーにできるだけ長くログインしたままにしてもらいたい (独特の?) 状況にあります。理想的には、1 か月です (マーケティングでは 1 年が必要でした)。デフォルトのファイルではなく、データベースにセッション データを保存しています。
私たちは、個人情報やセキュリティ上のリスクとなるその他のものを保存しません。
私が直面している問題は、大量のセッション データをテーブルに蓄積して、それがサーバーの遅延に影響を与えたくないということです。そのためには、誰かのセッションを匿名で 86400 秒 (1 日) 保存したいのですが、ログインしたら 2592000 秒 (30 日) に変更します。
私は zend フレームワーク 1.12 を使用しており、application.ini は次のようになっています。
resources.session.gc_maxlifetime = 86400
resources.session.remember_me_seconds = 2592000
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "session"
resources.session.saveHandler.options.primary[] = "session_id"
resources.session.saveHandler.options.primary[] = "save_path"
resources.session.saveHandler.options.primary[] = "name"
resources.session.saveHandler.options.primaryAssignment[] = "sessionId"
resources.session.saveHandler.options.primaryAssignment[] = "sessionSavePath"
resources.session.saveHandler.options.primaryAssignment[] = "sessionName"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "session_data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"
初めてサイトにアクセスしたとき、ライフタイムは「86400」に設定されていますが、ログインすると変更されません。私は、remember_me はガベージ コレクションとは異なり、1 日後に収集されてセッションが破壊されるため、私の 1 か月間の remember_me は無意味であると想定しています。ということで、ログイン時に修正してみました。これが私のログインロジックです:
$adapter = new Activejunky_Auth_Adapter_Doctrine($values['username'], $values['password']);
$auth = Zend_Auth::getInstance();
$sessionOptions = array(
'gc_maxlifetime' => 2592000,
'remember_me_seconds' => 2592000,
);
Zend_Session::setOptions($sessionOptions);
Zend_Session::rememberMe(60 * 60 * 24 * 30);
error_log('you working?');
Zend_Session::start();
$result = $auth->authenticate($adapter);
if ( $result->isValid() )
{
$user = $adapter->getResultObject();
$user->last_login = time();
$user->save();
//STORE USER INFO
$authStorage = $auth->getStorage();
$authStorage->write($user->toArray());
それは、しかし、まだ動作しません。私は問題なくログインしていますが、ライフタイムはまだ 86400 に設定されています。これを行う方法はありますか? それとも私は試してみても気が狂っていますか?
編集
読みやすいので、これが私がやったことです。ログイン後のページ:
$aj = new Zend_Session_Namespace('aj');
if($aj->lifetime == 'day')
{
$db = Zend_Db_Table::getDefaultAdapter();
$sid = Zend_Session::getId();
$where = $db->quoteInto('session_id = ?', Zend_Session::getId());
$db->update('session', array('lifetime' => 2592000), $where);
$aj->lifetime = 'month';
}
そして、ここに私のapplication.iniがあります:
resources.session.gc_maxlifetime = 7200
resources.session.remember_me_seconds = 2592000
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "session"
resources.session.saveHandler.options.primary[] = "session_id"
resources.session.saveHandler.options.primary[] = "save_path"
resources.session.saveHandler.options.primary[] = "name"
resources.session.saveHandler.options.primaryAssignment[] = "sessionId"
resources.session.saveHandler.options.primaryAssignment[] = "sessionSavePath"
resources.session.saveHandler.options.primaryAssignment[] = "sessionName"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "session_data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"
resources.view.doctype = "HTML5"
resources.view.language = "en"