Session_set_save_handler not setting

时光毁灭记忆、已成空白 提交于 2019-12-22 07:54:11

问题


I'm having issues with setting session_set_save_handler. I configured my php.ini to session.handler = user

This simple test is failing:

//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');

Here is my session class.

//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;
}


}

The only thing I can think of is $db is an suppose to be an object of my MySQL DB class but I can't include the class and then create an instance of it.

I didn't want to reinvent the wheel on the DB class so I grabbed it from Jeff Williams here: http://www.phpclasses.org/package/3698-PHP-MySQL-database-access-wrapper.html

I've tried to include it out side the class body put then the page doesn't render, just a blank white page no errors.:

<?php
include 'mysql.class.php';
$db = new MySQL(true);

class session
{

//Constructor
function __construct(){
....

回答1:


Setting the session save handler fails:

session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc")

Because these callbacks you want to register to do not exists:

var_dump(is_callable("sess_open")); # FALSE

That is because your object methods needs to be properly registered as callbacks. An object method callback is written in form of an array with two elements, the first one is the object, the second one a string of the methodname. Example from PHP net that is similar to yours:

$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')
);

As you can see, each method is written as a single array with the first element $handler always.

From within the class you can use $this to refer to the same object. But before your fully write your own, check the session_set_save_handler() PHP manual page for infos, examples and user contributed notes. There are different ways how you can organize that for your case.




回答2:


If you use the function inside the constructor then you need to pass in $this like so:

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')
);

And then instantiate the class

new SessionClass;

Whenever you are in doubt you can always take a look at the documentation. Be sure to read the comments as well; they are usually very helpful.



来源:https://stackoverflow.com/questions/13963811/session-set-save-handler-not-setting

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!