Session_set_save_handler не устанавливается

У меня проблемы с настройкой 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; 

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