Я в ситуации (уникальной?), Где я хочу, чтобы люди, которые вошли в систему, вошли в систему как можно дольше. В идеале, месяц (маркетинг хотел год). Мы сохраняем данные сеанса в базе данных, а не файл по умолчанию.Изменение gc_max_lifetime ПОСЛЕ того, как начался сеанс
Мы не храним никакой личной информации или чего-либо еще, что может представлять угрозу для безопасности.
Проблема, с которой я сталкиваюсь, заключается в том, что я не хочу накапливать тонны данных сеанса в таблице и оказывать влияние на задержку сервера. Чтобы сделать это, я хотел бы сохранить чей-то сеанс за 86400 секунд (1день), когда они анонимно, но измените его на 2592000 секунд (30 дней) после того, как они вошли в систему.
I ' м с использованием Zend Framework, 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 отличается от сбора мусора, и что мой месячный mem_me_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. Есть ли все-таки сделать это? или я орешки для даже попытки?
EDIT
Так его легче читать, вот что я сделал. на странице после того, как они вошли в систему:
$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"
У меня возникли трудности с инструментами сеанса Zend, используя специальный столбец в таблице сеансов. Но этот ответ вдохновил меня просто обновить сеанс, когда они вошли в систему. К сожалению, у меня также возникла проблема с обновлением сеанса с использованием той же логики, в которой они записываются. Поэтому я устанавливаю сеанс var и проверял его на следующей загрузке страницы: '\t if ($ aj-> lifetime == 'day') \t { \t \t $ db = Zend_Db_Table :: getDefaultAdapter(); \t \t $ sid = Zend_Session :: getId(); \t \t $ where = $ db-> quoteInto ('session_id =?', Zend_Session :: getId()); \t \t $ db-> update ('session', array ('lifetime' => 2592000), $ where); \t \t $ aj-> lifetime = 'month'; \t} ' – user2188915