熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> PHP編程 >> 正文

解析php session

2013-11-15 12:37:37  來源: PHP編程 
本篇文章是對php中session_set_save_handler 函數的用法(mysql)進行了詳細的分析介紹需要的朋友參考下   復制代碼 代碼如下:
<?php
/*============================文件說明========================================
@filename: sessionclassphp
@description: 數據庫保存在線用戶session實現在線用戶功能!
@notice: session過期時間一個小時因為我們的站點是使用cookie(有效時間是小時)登錄
因此我們只記錄用戶登錄的時間而不是刷新一次更新一次
刪除數據庫中session記錄的動作發生在用戶超時後執行這個文件或正常退出(session_destory)
@database: database:sessions field:sessionid(char)uid(int)last_visit(int)
=============================================================================
*/
class session {
private $db;
private $lasttime=;//超時時間一個小時
function session(&$db) {
$this>db = &$db;
session_module_name(user); //session文件保存方式這個是必須的!除非在Phpini文件中設置了
session_set_save_handler(
array(&$this open) //在運行session_start()時執行
array(&$this close) //在腳本執行完成或調用session_write_close() 或 session_destroy()時被執行即在所有session操作完後被執行
array(&$this read) //在運行session_start()時執行因為在session_start時會去read當前session數據
array(&$this write) //此方法在腳本結束和使用session_write_close()強制提交SESSION數據時執行
array(&$this destroy) //在運行session_destroy()時執行
array(&$this gc) //執行概率由sessiongc_probability 和 sessiongc_divisor的值決定時機是在openread之後session_start會相繼執行openread和gc
);
session_start(); //這也是必須的打開session必須在session_set_save_handler後面執行
}
function unserializes($data_value) {
$vars = preg_split(
/([azAZ_xfxff][azAZ_xfxff]*)|/
$data_value PREG_SPLIT_NO_EMPTY |
PREG_SPLIT_DELIM_CAPTURE
);
for ($i = ; isset($vars[$i]); $i++) {
$result[$vars[$i++]] = unserialize($vars[$i]);
}
return $result;
}
function open($path $name) {
return true;
}
function close() {
$this>gc($this>lasttime);
return true;
}
function read($SessionKey){
$sql = "SELECT uid FROM sessions WHERE session_id = "$SessionKey" limit ";
$query =$this>db>query($sql);
if($row=$this>db>fetch_array($query)){
return $row[uid];
}else{
return "";
}
}
function write($SessionKey$VArray) {
require_once(MRootDIR_WS_CLASSES db_mysql_classphp);
$db=new DbCom();
// make a connection to the database now
$db>connect(DB_SERVER DB_SERVER_USERNAME DB_SERVER_PASSWORD DB_DATABASE);
$db>query("set names utf");
$this>db=$db;
$SessionArray = addslashes($VArray);
$data=$this>unserializes($VArray);
$sql = "SELECT uid FROM sessions WHERE session_id = "$SessionKey" limit ";
$query =$this>db>query($sql);
if($this>db>num_rows($query)<=){
if (isset($data[webid]) && !empty($data[webid])) {
$this>db>query("insert into `sessions` set `session_id` = $SessionKeyuid="$data[webid]"last_visit="time()"");
}
return true;
}else{
/*$sql = "update `sessions` set ";
if(isset($data[webid])){
$sql = "uid = "$data[webid]" " ;
}
$sql="`last_visit` = null "
"where `session_id` = $SessionKey";
$this>db>query($sql); */
return true;
}
}
function destroy($SessionKey) {
$this>db>query("delete from `sessions` where `session_id` = $SessionKey");
return true;
}
function gc($lifetime) {
$this>db>query("delete from `sessions` where unix_timestamp(now()) `last_visit` > "$this>lasttime"");
return true;
}
}
?>

  
下面是phpini中session的配置說明
sessionsave_handler = "files"
存儲和檢索與會話關聯的數據的處理器名字默認為文件("files")
如果想要使用自定義的處理器(如基於數據庫的處理器)可用"user"
有一個使用PostgreSQL的處理器

sessionsave_path = "/tmp"
傳遞給存儲處理器的參數對於files處理器此值是創建會話數據文件的路徑
Windows下默認為臨時文件夾路徑
你可以使用"N[MODE]/path"這樣模式定義該路徑(N是一個整數)
N表示使用N層深度的子目錄而不是將所有數據文件都保存在一個目錄下
[MODE]可選必須使用進制數默認(=)表示每個目錄下最多保存的會話文件數量
這是一個提高大量會話性能的好主意
注意: "N[MODE]/path"兩邊的雙引號不能省略
注意: [MODE]並不會改寫進程的umask
注意: php不會自動創建這些文件夾結構請使用ext/session目錄下的mod_filessh腳本創建
注意: 如果該文件夾可以被不安全的用戶訪問(比如默認的"/tmp")那麼將會帶來安全漏洞
注意: 當N>時自動垃圾回收將會失效具體參見下面有關垃圾搜集的部分

  sessionname = "PHPSESSID"
用在cookie裡的會話ID標識名只能包含字母和數字

  sessionauto_start = Off
在客戶訪問任何頁面時都自動初始化會話默認禁止
因為類定義必須在會話啟動之前被載入所以若打開這個選項你就不能在會話中存放對象

  sessionserialize_handler = "php"
用來序列化/解序列化數據的處理器php是標准序列化/解序列化處理器
另外還可以使用"php_binary"當啟用了WDDX支持以後將只能使用"wddx"

  sessiongc_probability =
sessiongc_divisor =
定義在每次初始化會話時啟動垃圾回收程序的概率
這個收集概率計算公式如下sessiongc_probability/sessiongc_divisor
對會話頁面訪問越頻繁概率就應當越小建議值為/~

  sessiongc_maxlifetime =
超過此參數所指的秒數後保存的數據將被視為垃圾並由垃圾回收程序清理
判斷標准是最後訪問數據的時間(對於FAT文件系統是最後刷新數據的時間)
如果多個腳本共享同一個sessionsave_path目錄但sessiongc_maxlifetime不同
那麼將以所有sessiongc_maxlifetime指令中的最小值為准
如果使用多層子目錄來存儲數據文件垃圾回收程序不會自動啟動
你必須使用一個你自己編寫的shell腳本cron項或者其他辦法來執行垃圾搜集
比如下面的腳本相當於設置了"sessiongc_maxlifetime=" (分鐘)
cd /path/to/sessions find cmin + | xargs rm

  sessionreferer_check =
如果請求頭中的"Referer"字段不包含此處指定的字符串則會話ID將被視為無效
注意如果請求頭中根本不存在"Referer"字段的話會話ID將仍將被視為有效
默認為空即不做檢查(全部視為有效)

  sessionentropy_file = "/dev/urandom"
附加的用於創建會話ID的外部高熵值資源(文件)
例如UNIX系統上的"/dev/random"或"/dev/urandom"

  sessionentropy_length =
從高熵值資源中讀取的字節數(建議值)

  sessionuse_cookies = On
是否使用cookie在客戶端保存會話ID

  sessionuse_only_cookies = Off
是否僅僅使用cookie在客戶端保存會話ID
打開這個選項可以避免使用URL傳遞會話帶來的安全問題
但是禁用Cookie的客戶端將使會話無法工作

  sessioncookie_lifetime =
傳遞會話ID的Cookie有效期(秒) 表示僅在浏覽器打開期間有效

  sessioncookie_path = "/"
傳遞會話ID的Cookie作用路徑

  sessioncookie_domain =
傳遞會話ID的Cookie作用域
默認為空表示表示根據cookie規范生成的主機名

  sessioncookie_secure = Off
是否僅僅通過安全連接(https)發送cookie

  sessioncookie_httponly = Off
是否在cookie中添加httpOnly標志(僅允許HTTP協議訪問)
這將導致客戶端腳本(JavaScript等)無法訪問該cookie
打開該指令可以有效預防通過XSS攻擊劫持會話ID

  sessioncache_limiter = "nocache"
設為{nocache|private|public}以指定會話頁面的緩存控制模式
或者設為空以阻止在http應答頭中發送禁用緩存的命令

  sessioncache_expire =
指定會話頁面在客戶端cache中的有效期限(分鐘)
sessioncache_limiter=nocache時此處設置無效

  sessionuse_trans_sid = Off
是否使用明碼在URL中顯示SID(會話ID)
默認是禁止的因為它會給你的用戶帶來安全危險
用戶可能將包含有效sid的URL通過email/irc/QQ/MSN…途徑告訴給其他人
包含有效sid的URL可能會被保存在公用電腦上
用戶可能保存帶有固定不變sid的URL在他們的收藏夾或者浏覽歷史紀錄裡面
基於URL的會話管理總是比基於Cookie的會話管理有更多的風險所以應當禁用

  sessionbug_compat_ = On
sessionbug_compat_warn = On
PHP之前的版本有一個未注明的"BUG"
即使在register_globals=Off的情況下也允許初始化全局session變量
如果你在PHP之後的版本中使用這個特性會顯示一條警告
建議關閉該"BUG"並顯示警告

  sessionhash_function =
生成SID的散列算法SHA的安全性更高一些
: MD ( bits)
: SHA ( bits)
建議使用SHA

  sessionhash_bits_per_character =
指定在SID字符串中的每個字符內保存多少bit
這些二進制數是hash函數的運算結果
: af
: av
: az AZ "" ""
建議值為

  url_rewritertags = "a=hrefarea=hrefframe=srcform=fieldset="
此指令屬於PHP核心部分並不屬於Session模塊
指定重寫哪些HTML標簽來包含SID(僅當sessionuse_trans_sid=On時有效)
form和fieldset比較特殊
如果你包含他們URL重寫器將添加一個隱藏的"<input>"它包含了本應當額外追加到URL上的信息
如果要符合XHTML標准請去掉form項並在表單字段前後加上<fieldset>標記
注意所有合法的項都需要一個等號(即使後面沒有值)
推薦值為"a=hrefarea=hrefframe=srcinput=srcform=fakeentry"


From:http://tw.wingwit.com/Article/program/PHP/201311/21306.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.