簡體   English   中英

Session_set_save_handler未設置

[英]Session_set_save_handler not setting

我在設置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數據庫類的對象,但我不能包含該類,然后創建它的實例。

我不想重新發明數據庫類,所以我從傑夫威廉姆斯那里抓住它: 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 net的示例與您的類似:

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

無論何時您有疑問,您都可以隨時查看文檔 一定要閱讀評論; 他們通常非常有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM