您好,登錄后才能下訂單哦!
小編給大家分享一下PHP如何實(shí)現(xiàn)將session信息存儲(chǔ)到數(shù)據(jù)庫(kù)的類,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!
具體分析如下:
SessionHandlerInterface接口是PHP內(nèi)置的接口,直接實(shí)現(xiàn)就行了
具體可以看php手冊(cè)關(guān)于session_set_save_handler函數(shù)的解釋!
PHP代碼如下:
/** * session信息存儲(chǔ)到數(shù)據(jù)庫(kù)的類 * 表結(jié)構(gòu): * CREATE TABLE IF NOT EXISTS `sessioninfo` ( * `sid` varchar(255) NOT NULL, * `value` text NOT NULL, * `expiration` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, * PRIMARY KEY (`sid`) * ) ENGINE=InnoDB DEFAULT CHARSET=utf8; */ class MySessionHandler implements SessionHandlerInterface { /** * @access private * @var object 數(shù)據(jù)庫(kù)連接 */ private $_dbLink; /** * @access private * @var string 保存session的表名 */ Private $_sessionTable; /** * @access private * @var string session名 */ private $_sessionName; /** * @const 過(guò)期時(shí)間 */ const SESSION_EXPIRE = 10; public function __construct($dbLink, $sessionTable) { if(!is_object($dbLink)) { return false; } $this->_dbLink = $dbLink; $this->_sessionTable = $sessionTable; } /** * 打開(kāi) * @access public * @param string $session_save_path 保存session的路徑 * @param string $session_name session名 * @return integer */ public function open($session_save_path, $session_name) { $this->_sessionName = $session_name; return 0; } /** * 關(guān)閉 * @access public * @return integer */ public function close() { return 0; } /** * 關(guān)閉session * @access public * @param string $session_id session ID * @return string */ public function read($session_id) { $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = {$session_id} AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())"; $result = $this->_dbLink->query($query); if(!isset($value) || empty($value)) { $value = ""; return $value; } $this->_dbLink->query("UPDATE {$this->_sessionTable} SET expiration = CURRENT_TIMESTAMP() WHERE sid = {$session_id}"); $value = $result->fetch_array(); $result->free(); return $value['value']; } /** * 寫入session * @access public * @param string $session_id session ID * @param string $session_data session data * @return integer */ public function write($session_id, $session_data) { $query = "SELECT value FROM {$this->_sessionTable} WHERE sid = '{$session_id}' AND UNIX_TIMESTAMP(expiration) + " . self::SESSION_EXPIRE . " > UNIX_TIMESTAMP(NOW())"; $result = $this->_dbLink->query($query); $result = $result->fetch_array(); if(!empty($result)) { $result = $this->_dbLink->query("UPDATE {$this->_sessionTable} SET value = {$session_data} WHERE sid = {$session_id}"); } else{ $result = $this->_dbLink->query("INSERT INTO {$this->_sessionTable} (sid, value) VALUES ('{$session_id}', '{$session_data}')"); } if($result){ return 0; } else{ return 1; } } /** * 銷魂session * @access public * @param string $session_id session ID * @return integer */ public function destroy($session_id) { $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE sid = '{$session_id}'"); if($result){ return 0; } else{ return 1; } } /** * 垃圾回收 * @access public * @param string $maxlifetime session 最長(zhǎng)生存時(shí)間 * @return integer */ public function gc($maxlifetime) { $result = $this->_dbLink->query("DELETE FROM {$this->_sessionTable} WHERE UNIX_TIMESTAMP(expiration) < UNIX_TIMESTAMP(NOW()) - " . self::SESSION_EXPIRE); if($result){ return 0; } else{ return 1; } } } $dbLink = new mysqli("localhost", "root", "root", "test"); $sessionTable = "sessioninfo"; $handler = new MySessionHandler($dbLink, $sessionTable); session_set_save_handler($handler); session_start(); $_SESSION['name'] = "test"; echo $_SESSION["name"]; //session_destroy();
看完了這篇文章,相信你對(duì)“PHP如何實(shí)現(xiàn)將session信息存儲(chǔ)到數(shù)據(jù)庫(kù)的類”有了一定的了解,如果想了解更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。