У меня есть приложение в Zend, где мне нужно внедрить систему, которая будет регистрировать время работы пользователей в базе данных. Существует id_worktime, id_user, login_time и logout_time. Войти и выйти легко, но есть проблема, когда пользователь не делает ничего дольше, чем gc_maxlifetime. Я написал расширение класса Zend_Session_SaveHandler_DbTable, где я переопределяю метод gc ():
class Vao_Session extends Zend_Session_SaveHandler_DbTable
{
public function gc($maxlifetime)
{
$garbage = $this->fetchAll($this->select()->from('session')->where('`modified` + `lifetime` < ?', time()));
foreach ($garbage as $session)
{
$variables = array();
$a = preg_split("/(\w+)\|/", $session['data'], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
for($i = 0; $i < count($a); $i = $i + 2){
$variables[$a[$i]] = unserialize($a[$i + 1]);
}
if (isset($variables['worktime']))
{
$worktime = $variables['worktime'];
$idWorktime = $worktime['id_worktime'];
if ($idWorktime)
{
$date = new Zend_Date($session['modified']);
$data['logout_time'] = $date->toString(Zend_Date::ISO_8601);
$worktimeTable = new Application_Model_DbTable_Worktime();
$worktimeTable->update($data, 'id_worktime = '.$idWorktime);
}
}
}
parent::gc($maxlifetime);
}
}
Это работает нормально, когда я нажимаю обновить из другого веб-браузера - старые строки в таблице сеансов удаляются, а logout_time обновляется в таблице рабочего времени. Но когда я нажимаю «Обновить» в веб-браузере, где пользователь вошел в систему (сеанс, конечно, сейчас истек), ничто не добавляется в рабочее время, а строка в сеансе обновляется - столбец «измененный» устанавливается на текущее время, а «данные» равны
SessionPreferencesFlag|a:1:{s:16:"sessionSavedInDb";b:1;}
(до того, как появился объект Zend_Auth и многое другое, в том числе id_worktime, который мне нужен).
А теперь вопрос - какая часть Zend Framework очищает эту строку сеанса? Я предполагаю, что это что-то в Zend_Session, но я действительно не могу найти это. Помогите, пожалуйста?