您的位置:首页 > 编程语言 > PHP开发

PHP的session_set_save_handler 执行机制

2012-02-14 11:01 691 查看
/*


02
Session open (called by session_start( ))
03
Session close (called at page end)
04
Session read (called after session_start( ) )
05
Session write (called when session data is to be written)
06
Session destroy (called by session_destroy( ) )
07
Session garbage collect (called randomly)
08
*/
09
<?
10
    
function

sess_open(
$sess_path
,
$sess_name
) {
11
            
print
"Session opened.\n"
;
12
            
print
"Sess_path: $sess_path\n"
;
13
            
print
"Sess_name: $sess_name\n\n"
;
14
            
return

true;
15
    
}
16
 
17
    
function

sess_close( ) {
18
            
print
"Session closed.\n"
;
19
            
return

true;
20
    
}
21
 
22
    
function

sess_read(
$sess_id
) {
23
            
print
"Session read.\n"
;
24
            
print
"Sess_ID: $sess_id\n"
;
25
            
return

''
;
26
    
}
27
 
28
    
function

sess_write(
$sess_id
,
$data
) {
29
            
print
"Session value written.\n"
;
30
            
print
"Sess_ID: $sess_id\n"
;
31
            
print
"Data: $data\n\n"
;
32
            
return

true;
33
    
}
34
 
35
    
function

sess_destroy(
$sess_id
) {
36
            
print
"Session destroy called.\n"
;
37
            
return

true;
38
    
}
39
 
40
    
function

sess_gc(
$sess_maxlifetime
) {
41
            
print
"Session garbage collection called.\n"
;
42
            
print
"Sess_maxlifetime: $sess_maxlifetime\n"
;
43
            
return

true;
44
    
}
45
 
46
    
session_set_save_handler(
"sess_open"
,
"sess_close"
,
"sess_read"
,
47
                    
"sess_write"
,
"sess_destroy"
,
"sess_gc"
);
48
    
session_start( );
49
 
50
    
$_SESSION
[
'foo'
] =
"bar"
;
51
    
print

"Some text\n"
;
52
    
$_SESSION
[
'baz'
] =
"wombat"
;
53
?>
1. 返回值的问题,为什么每个回调函数都有个retrun 的bool值?
2. 返回值的问题,比如read函数 返回一个false 会怎么样?true又怎么样?
3. 当session_start()开始后,这个函数session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc') 里面的_session_read是不是就是session_id?

1. 返回值的问题,为什么每个回调函数都有个retrun 的bool值?
Return Values
Returns TRUE on success or FALSE on failure.
这个是函数的定义值。如果你不想用,可以不用catch他。 如果需要,这样写 A  = session_set_save_handler()

返回值的问题,比如read函数  返回一个false 会怎么样?true又怎么样?
你可以结合IF来使用
比如 IF(session_set_save_handler()) 意思就是如果函数真....

session_set_save_handler('_session_open','_session_close','_session_read','_session_write','_session_destroy','_session_gc') 里面的_session_read是不是就是session_id?
是的,一个session就存一个系列的值
比如说你登陆一个网站,那你的所有动作产生的数据就在这个session里。


session_set_save_handler---设置用户级 session 存储函数

函数原型 
void session_set_save_handler (string open, string close, string read, string write, string destroy, string gc)

session_set_save_handler() 设置用户级 session 存储函数,用于存储和取回 session 相关的数据. 用于那些使用不同于 PHP Session 指定的存储方式的情况. 例如,在本地数据库存储 session 数据. 

注意: 你必须设置 php.ini 里面的 session.save_handler配置参数来让 session_set_save_handler() 正常工作. 

下面的例子提供了类似于 PHP 默认的保存文件句柄的基于文件的 session storage 方式. 这个例子可以很简单的扩展到使用熟悉的数据库引擎来进行数据库存储. 
例子:程序代码:[session_inc.php]
<?php 
$SESS_DBHOST = "yourhost"; /* database server hostname */ 
$SESS_DBNAME = "yourdb"; /* database name */ 
$SESS_DBUSER = "youruser"; /* database user */ 
$SESS_DBPASS = "yourpassword"; /* database password */ 

$SESS_DBH = ""; 
$SESS_LIFE = get_cfg_var("session.gc_maxlifetime"); 

function sess_open($save_path,$session_name) { 
    global $SESS_DBHOST,$SESS_DBNAME,$SESS_DBUSER,$SESS_DBPASS,$SESS_DBH; 

    if (! $SESS_DBH = mysql_pconnect($SESS_DBHOST,$SESS_DBUSER,$SESS_DBPASS)) { 
        echo "<li>Can't connect to $SESS_DBHOST as $SESS_DBUSER"; 
        echo "<li>MySQL Error: " . mysql_error(); 
        die; 
    } 

    if (! mysql_select_db($SESS_DBNAME,$SESS_DBH)) { 
        echo "<li>Unable to select database $SESS_DBNAME"; 
        die; 
    } 

    return true; 


function sess_close() { 
    return true; 


function sess_read($key) { 
    global $SESS_DBH,$SESS_LIFE; 

    $qry = "SELECT value FROM session_tbl WHERE sesskey = '$key' AND expiry > " . time(); 
    $qid = mysql_query($qry,$SESS_DBH); 

    if (list($value) = mysql_fetch_row($qid)) { 
        return $value; 
    } 

    return false; 


function sess_write($key,$val) { 
    global $SESS_DBH,$SESS_LIFE; 

    $expiry = time() + $SESS_LIFE; //过期时间 
    $value = addslashes($val); 

    $qry = "INSERT INTO session_tbl VALUES ('$key',$expiry,'$value')"; 
    $qid = mysql_query($qry,$SESS_DBH); 

    if (! $qid) { 
        $qry = "UPDATE session_tbl SET expiry = $expiry,value = '$value' WHERE sesskey = '$key' AND expiry > " . time(); 
        $qid = mysql_query($qry,$SESS_DBH); 
    } 

    return $qid; 


function sess_destroy($key) { 
    global $SESS_DBH; 

    $qry = "DELETE FROM session_tbl WHERE sesskey = '$key'"; 
    $qid = mysql_query($qry,$SESS_DBH); 

    return $qid; 


function sess_gc($maxlifetime) { 
    global $SESS_DBH; 

    $qry = "DELETE FROM session_tbl WHERE expiry < " . time(); 
    $qid = mysql_query($qry,$SESS_DBH); 

    return mysql_affected_rows($SESS_DBH); 


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

session_start(); 
?>
完成以上步骤后,在程序中使用require("session_inc.php")来代替session_start()即可,其他的session函数还是象以前一样的方法调用
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息