Отсутствует параметр записи пользовательского сеанса PHP

Я получаю странную ошибку, которую я не видел раньше при использовании пользовательского обработчика сессий в PHP (код ниже). Когда вызывается session_start (), я получаю предупреждение: отсутствует аргумент 2 для Session :: write () в строке 22 и переменную Notice: Undefined: data в строке 25.

Строка 22 - это открытая функция записи ($ id, $ data), а строка 25 - это то место, где переменная данных используется чуть ниже.

Кто-нибудь может увидеть ошибку в моем коде?

Спасибо

    class Session {

    private $db;
    private $expires_time;

    public function __construct($database, $expires_time) {
        $this->db = $database;
        $this->expires_time = $expires_time;
    }

    public function open($path, $name) {
        return true;
    }

    public function close() {
        return true;
    }

    public function write($id, $data) {
        $expires = time() + $this->expires_time;
        $query = $this->db->prepare('REPLACE INTO sessions (id, data, expires) VALUES (:id, :data, :expires)');
        return $query->execute(array(":id" => $id, ":data" => $data, ":expires" => $expires));
    }

    public function read($id) {
        $query = $this->db->prepare('SELECT data FROM sessions WHERE id = :id AND expires > :expires LIMIT 1');
        $query->execute(array(':id' => $id, ':expires' => time()));
        if($session = $query->fetch()) {
            return $session['data'];
        }
        return '';
    }

    public function destroy($id) {
        $query = $this->db->prepare('DELETE FROM sessions WHERE id = :id');
        return $query->execute(array(':id', $id));
    }

    public function clean($max) {
        $query = $this->db->prepare('DELETE FROM sessions WHERE expires < :expires');
        return $query->execute(array(':expires', $max));
    }

}

А следующий код создает объект и устанавливает обработчик сохранения сеанса.

    $sess_expires_time = 3600;
$session = new Session($_DATABASE, $sess_expires_time);
session_set_save_handler(
    array($session, '_open'),
    array($session, '_close'),
    array($session, '_write'),
    array($session, '_read'),
    array($session, '_destroy'),
    array($session, '_clean')   
);
session_start();

php,oop,session,

1

Ответов: 2


register_shutdown_function('session_write_close');

PHP уже позаботится об этом. Не то чтобы вы писали второй раз (а потом провоцировали ошибку, о которой идет речь). Так что убери эту строку.

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

Кроме того, вы не делаете отслеживание открытия / закрытия в вашем обработчике сохранения. Как вы можете знать, что вы должны написать, когда сессия закрыта?

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


Проблема обнаружена. Глупый, тупой, тупой.

У меня был неправильный порядок методов в session_set_save_handler, и я вызывал write и read в неправильном порядке.

Спасибо за совет.

PHP, OOP, сессия,
Похожие вопросы