【问题标题】:Session_set_save_handler not settingSession_set_save_handler 未设置
【发布时间】:2012-12-07 11:30:44
【问题描述】:

我在设置 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 类上重新发明轮子,所以我从 Jeff Williams 那里得到了它: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(){
....

【问题讨论】:

    标签: php mysql session handler


    【解决方案1】:

    如果你在构造函数中使用函数,那么你需要像这样传入$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;
    

    当您有任何疑问时,您可以随时查看the documentation。请务必阅读 cmets;它们通常很有帮助。

    【讨论】:

    • Sverri,感谢您将此直接关联到我的代码集!
    【解决方案2】:

    设置会话保存处理程序失败:

    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 manual page 以获取信息、示例和用户贡献的注释。您可以通过不同的方式来组织您的案例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      相关资源
      最近更新 更多