0

Я в ситуации (уникальной?), Где я хочу, чтобы люди, которые вошли в систему, вошли в систему как можно дольше. В идеале, месяц (маркетинг хотел год). Мы сохраняем данные сеанса в базе данных, а не файл по умолчанию.Изменение 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" 

ответ

0

Для базы данных поддержанных-сессий, вы можете определенно контролировать поведение удаления сеанса. gc_max_lifetime - это просто параметр, который передается вашей функции обработчика сеанса . Его можно использовать или игнорировать, как вам нравится. Вам просто нужно использовать любую логику, которую вы желаете.

Например, вы можете просто добавить поле в базу данных, чтобы определить, является ли это «длинным» сеансом или «короткой сессией». Затем соответствующим образом измените DELETE SQL. Так что-то вроде этого:

DELETE FROM sessions 
WHERE 
    (long_session = 1 AND timestamp_field < DATE_SUB(NOW(), INTERVAL 30 DAYS)) OR 
    (long_session = 0 AND timestamp_filed < DATE_SUB(NOW(), INTERVAL 1 DAY)) 

Здесь вы можете использовать ИНТЕРВАЛ X СЕКУНД, а если вы хотите использовать значение gc_max_lifetime, переданное в gc().

+0

У меня возникли трудности с инструментами сеанса 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

Смежные вопросы