《PHP學(xué)習(xí):php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫實例》要點:
本文介紹了PHP學(xué)習(xí):php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫實例,希望對您有用。如果有疑問,可以聯(lián)系我們。
PHP保留session默認(rèn)的是采用的文件的方式來保留的,這僅僅在文件的空間開銷很小的windows上是可以采用的,但是如果我們采用uinx或者是liux上的文件系統(tǒng)的時候,這樣的文件系統(tǒng)的文件空間開銷是很大的,然而session是要時時刻刻的使用的,大量的用戶就要創(chuàng)建很多的session文件,這樣對整個的服務(wù)器帶來性能問題.PHP實例
另一方面,如果服務(wù)器起采用群集的方式的話就不能堅持session的一致性,所以我們就緒要采用數(shù)據(jù)庫的方式來保存session,這樣,不管有幾臺服務(wù)器同時使用,只要把他們的session保存在一臺數(shù)據(jù)庫服務(wù)器上就可以保證session的完整了,具體如何來實現(xiàn)請繼續(xù)看下去.PHP實例
PHP保留session默認(rèn)的情況下是采用的文件方式來保留的,我們在PHP的配制文件PHP.ini中可以看到這樣的一行:
PHP實例
建立數(shù)據(jù)庫和數(shù)據(jù)庫的表結(jié)構(gòu),我們可以采用PHP可以使用的任何的數(shù)據(jù)庫,因為PHP和mysql的結(jié)合最好,我就使用mysql來做示例,當(dāng)然根據(jù)你的需要可以改稱別的數(shù)據(jù)庫.PHP實例
創(chuàng)立數(shù)據(jù)庫
PHP實例
保留成為session_user_start.php.PHP實例
現(xiàn)在我們的PHP保存session的工作就已經(jīng)完成了,只要你在需要在使用session的時候,把session_user_start.php包含進來.注意,這個文件一定要在文件的第一行包含,然后就像使用文件的session一樣的辦法使用就可以了.PHP實例
以上僅僅是個簡單教程,在實際的利用中,可以對它封裝得更專業(yè)些,參考代碼如下:PHP實例
SessionMysql.class.php
PHP實例
defined('IN_QIAN') or exit('Access Denied');PHP實例
class SessionMysql {PHP實例
?public $lifetime = 1800; // 有效期,單元:秒(s),默認(rèn)30分鐘
?public $db;
?public $table;PHP實例
?/**
? * 構(gòu)造函數(shù)
? */
?public function __construct() {
??$this->db = Base::loadModel('SessionModel');
??$this->lifetime = Base::loadConfig('system', 'session_lifetime');
??session_set_save_handler(
???array(&$this, 'open'),??// 在運行session_start()時執(zhí)行
???array(&$this, 'close'),??// 在腳本執(zhí)行完成 或 調(diào)用session_write_close() 或 session_destroy()時被執(zhí)行,即在所有session操作完后被執(zhí)行
???array(&$this, 'read'),??// 在運行session_start()時執(zhí)行,因為在session_start時,會去read當(dāng)前session數(shù)據(jù)
???array(&$this, 'write'),??// 此辦法在腳本結(jié)束和使用session_write_close()強制提交SESSION數(shù)據(jù)時執(zhí)行
???array(&$this, 'destroy'),?// 在運行session_destroy()時執(zhí)行
???array(&$this, 'gc')???// 執(zhí)行概率由session.gc_probability 和 session.gc_divisor的值決定,時機是在open,read之后,session_start會相繼執(zhí)行open,read和gc
??);
??session_start(); // 這也是必須的,打開session,必須在session_set_save_handler后面執(zhí)行
?}
?/**
? * session_set_save_handler open辦法
? *
? * @param $savePath
? * @param $sessionName
? * @return true
? */
?public function open($savePath, $sessionName) {
??return true;
?}
?/**
? * session_set_save_handler close辦法
? *
? * @return bool
? */
?public function close() {
??return $this->gc($this->lifetime);
?}
?/**
? * 讀取session_id
? *
? * session_set_save_handler read辦法
? * @return string 讀取session_id
? */
?public function read($sessionId) {
??$condition = array(
???'where' => array(
????'session_id' => $sessionId
???),
???'fields' => 'data'
??);
??$row = $this->db->fetchFirst($condition);
??return $row ? $row['data'] : '';
?}
?/**
? * 寫入session_id 的值
? *
? * @param $sessionId 會話ID
? * @param $data 值
? * @return mixed query 執(zhí)行結(jié)果
? */
?public function write($sessionId, $data) {
??$userId = isset($_SESSION['userId']) ? $_SESSION['userId'] : 0;
??$roleId = isset($_SESSION['roleId']) ? $_SESSION['roleId'] : 0;
??$grouId = isset($_SESSION['grouId']) ? $_SESSION['grouId'] : 0;
??$m = defined('ROUTE_M') ? ROUTE_M : '';
??$c = defined('ROUTE_C') ? ROUTE_C : '';
??$a = defined('ROUTE_A') ? ROUTE_A : '';
??if (strlen($data) > 255) {
???$data = '';
??}
??$ip = get_ip();
??$sessionData = array(
???'session_id'?=> $sessionId,
???'user_id'??=> $userId,
???'ip'???=> $ip,
???'last_visit'?=> SYS_TIME,
???'role_id'??=> $roleId,
???'group_id'??=> $grouId,
???'m'????=> $m,
???'c'????=> $c,
???'a'????=> $a,
???'data'???=> $data,
??);
??return $this->db->insert($sessionData, 1, 1);
?}
?/**
? * 刪除指定的session_id
? *
? * @param string $sessionId 會話ID
? * @return bool
? */
?public function destroy($sessionId) {
??return $this->db->delete(array('session_id' => $sessionId));
?}
?/**
? * 刪除過期的 session
? *
? * @param $lifetime session有效期(單位:秒)
? * @return bool
?*/
?public function gc($lifetime) {
??$expireTime = SYS_TIME - $lifetime;
??return $this->db->delete("`last_visit`<$expireTime");
?}
}
PHP實例
在系統(tǒng)文件的某個處所,實例化這個類即可!PHP實例
歡迎參與《PHP學(xué)習(xí):php中使用session_set_save_handler()函數(shù)把session保存到MySQL數(shù)據(jù)庫實例》討論,分享您的想法,維易PHP學(xué)院為您提供專業(yè)教程。
轉(zhuǎn)載請注明本頁網(wǎng)址:
http://www.snjht.com/jiaocheng/14205.html