PHP-сессии в базе данных

Как я могу хранить сеансы в базе данных? Я сделал это с помощью этого кода:

 function write ($session_id, $session_data)
// write session data to the database.
{
    if (!empty($this->fieldarray)) {
        if ($this->fieldarray['session_id'] != $session_id) {
            // user is starting a new session with previous data
            $this->fieldarray = array();
        } // if
    } // if

    if (empty($this->fieldarray)) {
        // create new record
        $array['session_id']   = $session_id;
        $array['date_created'] = getTimeStamp();
        $array['last_updated'] = getTimeStamp();
        $array['session_data'] = addslashes($session_data);
        $this->_dml_insertRecord($array);
    } else {
        // update existing record
        if (isset($_SESSION['logon_user_id'])) {
            $array['user_id']  = $_SESSION['logon_user_id'];
        } // if
        $array['last_updated'] = getTimeStamp();
        $array['session_data'] = addslashes($session_data);
        $this->_dml_updateRecord($array, $this->fieldarray);
    } // if

    return TRUE;

} // write

Но как я должен удалить его автоматически, как раньше. Я имею в виду, как автоматически удалять сеансы после таймаута?

Ответ 2

Мне пришлось иметь дело с этим еще некоторое время назад, и есть 2 решения, ни одно из которых не красиво, но вот оно.

  • В порядке событий (свободно) ваш script проверяет, есть ли идентификатор сеанса, отправленный на сервер, тогда он увидит, находится ли этот сеанс в вашей базе данных, и если сессия истек. Как только вы установили соединение с вашим сеансом db, вам может потребоваться запустить запрос DELETE для всех записей с датой истечения срока действия, предшествующей текущей отметке времени. Затем найдите идентификатор, который только что отправил пользователь. Таким образом, очистка выполняется каждый раз, когда люди используют ваш сайт.

  • Следующий способ, который вы могли бы рассмотреть, кроме того, - иметь работу CHRON или автоматическую script, которая выполняется так часто, чтобы очищать истекшие записи из вашей таблицы сеансов. Это хороший метод, если ваш сайт получает легкий и нечастый трафик.

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

Убедитесь, что в вашей системе есть кнопка выхода из определенного типа, что действие ручного входа в систему приведет к удалению сеанса пользователя.

Ответ 3

Посмотрите HTTP_Session2. Из документов PEAR:

HTTP_Session2 предоставляет дополнительные функции, такие как хранилище базы данных для данных сеанса, используя пакет DB и MDB2. Он также вводит новые методы, такие как isNew(), useCookies(), setExpire(), setIdle(), isExpired(), isIdled() и другие.

Если вы хотите реализовать свой, посмотрите код MDB2.php внутри этого пакета. Он содержит метод сбора мусора (gc), который в сочетании с session_set_save_handler должен делать трюк.

Ответ 4

В конце вашего кода session_destroy();, чтобы закрыть сеанс:

<?php
    session_destroy();
?>