本篇文章是對php中session_set_save_handler 函數的用法(mysql)進行了詳細的分析介紹 需要的朋友參考下 ? 復制代碼 代碼如下: <?php /*============================文件說明======================================== @filename: session class php @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文件保存方式 這個是必須的!除非在Php ini文件中設置了 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 ) //執行概率由session gc_probability 和 session gc_divisor的值決定 時機是在open read之後 session_start會相繼執行open read和gc ); session_start(); //這也是必須的 打開session 必須在session_set_save_handler後面執行 } function unserializes($data_value) { $vars = preg_split( /([a zA Z_x f xff][a zA Z _x f xff]*)|/ $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(MRoot DIR_WS_CLASSES db_mysql_class php ); $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` = $SessionKey uid= " $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; } } ?>
下面是php ini中session的配置說明 session save_handler = "files" 存儲和檢索與會話關聯的數據的處理器名字 默認為文件("files") 如果想要使用自定義的處理器(如基於數據庫的處理器) 可用"user" 有壹個使用PostgreSQL的處理器 session save_path = "/tmp" 傳遞給存儲處理器的參數 對於files處理器 此值是創建會話數據文件的路徑 Windows下默認為臨時文件夾路徑 妳可以使用"N[MODE]/path"這樣模式定義該路徑(N是壹個整數) N表示使用N層深度的子目錄 而不是將所有數據文件都保存在壹個目錄下 [MODE]可選 必須使用 進制數 默認 (= ) 表示每個目錄下最多保存的會話文件數量 這是壹個提高大量會話性能的好主意 註意 : "N[MODE]/path"兩邊的雙引號不能省略 註意 : [MODE]並不會改寫進程的umask 註意 : php不會自動創建這些文件夾結構 請使用ext/session目錄下的mod_files sh腳本創建 註意 : 如果該文件夾可以被不安全的用戶訪問(比如默認的"/tmp") 那麽將會帶來安全漏洞 註意 : 當N> 時自動垃圾回收將會失效 具體參見下面有關垃圾搜集的部分
session name = "PHPSESSID" 用在cookie裏的會話ID標識名 只能包含字母和數字
session auto_start = Off 在客戶訪問任何頁面時都自動初始化會話 默認禁止 因為類定義必須在會話啟動之前被載入 所以若打開這個選項 妳就不能在會話中存放對象
session serialize_handler = "php" 用來序列化/解序列化數據的處理器 php是標準序列化/解序列化處理器 另外還可以使用"php_binary" 當啟用了WDDX支持以後 將只能使用"wddx"
session gc_probability = session gc_divisor = 定義在每次初始化會話時 啟動垃圾回收程序的概率 這個收集概率計算公式如下 session gc_probability/session gc_divisor 對會話頁面訪問越頻繁 概率就應當越小 建議值為 / ~
session gc_maxlifetime = 超過此參數所指的秒數後 保存的數據將被視為 垃圾 並由垃圾回收程序清理 判斷標準是最後訪問數據的時間(對於FAT文件系統是最後刷新數據的時間) 如果多個腳本***享同壹個session save_path目錄但session gc_maxlifetime不同 那麽將以所有session gc_maxlifetime指令中的最小值為準 如果使用多層子目錄來存儲數據文件 垃圾回收程序不會自動啟動 妳必須使用壹個妳自己編寫的shell腳本 cron項或者其他辦法來執行垃圾搜集 比如 下面的腳本相當於設置了"session gc_maxlifetime= " ( 分鐘) cd /path/to/sessions find cmin + | xargs rm
session referer_check = 如果請求頭中的"Referer"字段不包含此處指定的字符串則會話ID將被視為無效 註意 如果請求頭中根本不存在"Referer"字段的話 會話ID將仍將被視為有效 默認為空 即不做檢查(全部視為有效)
session entropy_file = "/dev/urandom" 附加的用於創建會話ID的外部高熵值資源(文件) 例如UNIX系統上的"/dev/random"或"/dev/urandom"
session entropy_length = 從高熵值資源中讀取的字節數(建議值 )
session use_cookies = On 是否使用cookie在客戶端保存會話ID
session use_only_cookies = Off 是否僅僅使用cookie在客戶端保存會話ID 打開這個選項可以避免使用URL傳遞會話帶來的安全問題 但是禁用Cookie的客戶端將使會話無法工作
session cookie_lifetime = 傳遞會話ID的Cookie有效期(秒) 表示僅在瀏覽器打開期間有效
session cookie_path = "/" 傳遞會話ID的Cookie作用路徑
session cookie_domain = 傳遞會話ID的Cookie作用域 默認為空表示表示根據cookie規範生成的主機名
session cookie_secure = Off 是否僅僅通過安全連接()發送cookie
session cookie_only = Off 是否在cookie中添加Only標誌(僅允許HTTP協議訪問) 這將導致客戶端腳本(JavaScript等)無法訪問該cookie 打開該指令可以有效預防通過XSS攻擊劫持會話ID
session cache_limiter = "nocache" 設為{nocache|private|public}以指定會話頁面的緩存控制模式 或者設為空以阻止在應答頭中發送禁用緩存的命令
session cache_expire = 指定會話頁面在客戶端cache中的有效期限(分鐘) session cache_limiter=nocache時 此處設置無效
session use_trans_sid = Off 是否使用明碼在URL中顯示SID(會話ID) 默認是禁止的 因為它會給妳的用戶帶來安全危險 用戶可能將包含有效sid的URL通過email/irc/QQ/MSN…途徑告訴給其他人 包含有效sid的URL可能會被保存在公用電腦上 用戶可能保存帶有固定不變sid的URL在他們的收藏夾或者瀏覽歷史紀錄裏面 基於URL的會話管理總是比基於Cookie的會話管理有更多的風險 所以應當禁用
session bug_pat_ = On session bug_pat_warn = On PHP 之前的版本有壹個未註明的"BUG" 即使在register_globals=Off的情況下也允許初始化全局session變量 如果妳在PHP 之後的版本中使用這個特性 會顯示壹條警告 建議關閉該"BUG"並顯示警告
session hash_function = 生成SID的散列算法 SHA 的安全性更高壹些 : MD ( bits) : SHA ( bits) 建議使用SHA
session hash_bits_per_character = 指定在SID字符串中的每個字符內保存多少bit 這些二進制數是hash函數的運算結果 : a f : a v : a z A Z " " " " 建議值為
lishixinzhi/Article/program/PHP/201311/21306
上一篇:蚌埠古鎮旅遊蚌埠旅遊下一篇:2022河北安全第壹課:復習與理解(7篇)