У меня проблемы с настройкой session_set_save_handler. Я настроил свой php.ini на session.handler = user
Этот простой тест не работает:
//Define custom session handler if(session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")){ die('set fine'); }else{ die('Couldn\'t set session handler');
Вот мой класс сеанса.
//Constructor function __construct(){ //Define custom session handler if(session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")){ die('set fine'); }else{ die('Couldn\'t set session handler'); } //Start session session_start(); } //Custom session functions function sess_open($sess_path, $sess_name) { return true; } function sess_close() { return true; } function sess_read($sess_id) { //Query for session record in $results = $db->QuerySingleRow("SELECT data FROM sessions WHERE session_id = '$sess_id'"); //Check that record is returned if ($results != false) { //Session found, pull out data field value $sess_data = $results->data; //Grab current time $CurrentTime = time(); //Update session record with current timestamp $db->Query("UPDATE sessions SET last_updated = $CurrentTime WHERE session_id = '$sess_id'"); //Return return $sess_data; } else { //No session found //Grab current timestamp $CurrentTime = time(); //Insert new session to DB $db->Query("INSERT INTO sessions (session_id, last_updated) VALUES ('$sess_id', $CurrentTime)"); //Return blank per nature of session_set_save_handler read() return ''; } } function sess_write($sess_id, $data) { //Grab current timestamp $CurrentTime = time(); //Update session record to hold new data and update last_updated field $db->Query("UPDATE sessions SET data = '$data', last_updated = $CurrentTime WHERE session_id = '$sess_id'"); return true; } function sess_destroy($sess_id) { //Delete session from DB $db->Query("DELETE FROM sessions WHERE session_id = '$sess_id'"); return true; } function sess_gc($sess_maxlifetime) { //Get current timestamp $CurrentTime = time(); //Delete from session based on garbage collection $db->Query("DELETE FROM sessions WHERE last_updated < $CurrentTime"); return true; } }
Единственное, о чем я могу думать, это $ db – это быть объектом моего MySQL DB-класса, но я не могу включить этот класс, а затем создать его экземпляр.
Я не хотел изобретать колесо на классе DB, поэтому я схватил его от Джеффа Уильямса здесь: http://www.phpclasses.org/package/3698-PHP-MySQL-database-access-wrapper.html
Я попытался включить его в сторону тела класса, затем страница не отображается, просто пустая белая страница без ошибок .:
<?php include 'mysql.class.php'; $db = new MySQL(true); class session { //Constructor function __construct(){ ....
Установка обработчика сохранения сеанса не выполняется:
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")
Поскольку эти обратные вызовы, которые вы хотите зарегистрировать, не существуют:
var_dump(is_callable("sess_open")); # FALSE
Это связано с тем, что ваши объектные методы должны быть правильно зарегистрированы как обратные вызовы. Обратный вызов метода объекта записывается в виде массива с двумя элементами, первый из которых является объектом, второй – строкой имени метода. Пример из сети PHP, которая похожа на вашу:
$handler = new FileSessionHandler(); session_set_save_handler( array($handler, 'open'), array($handler, 'close'), array($handler, 'read'), array($handler, 'write'), array($handler, 'destroy'), array($handler, 'gc') );
Как вы можете видеть, каждый метод записывается как один массив с первым элементом $handler
всегда.
Из класса вы можете использовать $this
для обозначения одного и того же объекта. Но прежде чем вы полностью напишите свой собственный, ознакомьтесь с инструкцией на странице session_set_save_handler()
PHP для информации, примерами и примечаниями, внесенными пользователем. Есть разные способы, как вы можете организовать это для своего дела.
Если вы используете функцию внутри конструктора, вам необходимо передать в $this
так:
session_set_save_handler( array($this, 'sess_open'), array($this, 'sess_close'), array($this, 'sess_read'), array($this, 'sess_write'), array($this, 'sess_destroy'), array($this, 'sess_gc') );
И затем создайте экземпляр класса
new SessionClass;
Всякий раз, когда вы сомневаетесь, вы всегда можете взглянуть на документацию . Обязательно прочтите комментарии; они, как правило, очень полезны.