首先我们先说的是session大多数是以文件的形式存放在文件中,但是当session的数据达到一定的数量的时候,会极大的拖低了服务器的相应的速度,我们就不已文件的形式存储,就得出了两种方案,一种是存放在内存中,另一种的存放在mysql中
现在我们就来说一下session入库的操作
php的session默认的情况下是采用的文件方式来保存的,我们在php的配制文件php.ini中可以看到这样的一行,session.save_handler="files",这样的意思就是采用文件来保存session 的,要采用数据库来保存的话,我们需要修改成拥护模式,改称 session.save_handler="use"就可以了,但是,这仅仅是说明我门没有采用文件的方式存储session。
主要是通过 bool session_set_save_handler(seesion_open,seesion_close,session_read,session_write,session_destory,session_gc);
依次对应的是开启seesion连接方式,关闭session,读取session,写拉seesion,销毁session,seesion的垃圾加收机制。
告知session机制,在需要读写时,使用用户自定义的读写函数完成
Session_set_save_handler(
开始函数,结束函数,读函数,写函数,删除函数,GC函数
);
创建一个存放session的数据表(如下)
sid用于存放session_id的,字段类型为字符型,长度为32
value用于存放session的内容,字段类型为text
expiration用于存放session的生存期(最主要就是这三个)
下面给大家写了一个session入库的类库:
<?php class MySessionHandler implements SessionHandlerInterface { /** * @access private * @var object 数据库连接 */ private $_dbLink; /** * @access private * @var string 保存session的表名 */ Private $_sessionTable; /** * @access private * @var string session名 */ private $_sessionName; /** * @const 过期时间/秒 */ const SESSION_EXPIRE = 60; public function __construct($dbLink, $sessionTable) { if(!is_object($dbLink)) { return false; } $this->_dbLink = $dbLink; $this->_sessionTable = $sessionTable; } /** * 打开 * @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; } /** * 关闭session * @access public * @return integer */ public function close() { return 0; } /** * 读取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 自动获取session ID * @param string $session_data 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 最长生存时间 * @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; } } }
然后我们要将session入库了:
<?php header('content-type:text/html;charset=utf-8'); //date_default_timezone_set('PRC'); //引入类文件 require_once "MySessionHandler.class.php"; //链接数据库 $dbLink = new mysqli("localhost", "root", "root", "stucourse"); //定义需要操作的session数据表 $sessionTable = "sessioninfo"; //实类化类 $handler = new MySessionHandler($dbLink, $sessionTable); //告知session机制,在需要读写时,使用用户自定义的读写函数完成 session_set_save_handler($handler); //修改PHP.ini中session的垃圾回收触发得到频率(默认1/1000) ini_set('session.gc_probability',1); //分子 ini_set('session.gc_divisor',1); //分母 //开启session session_start(); $_SESSION['user'] = "liweijia"; echo $_SESSION["user"];
有什么不对的还请各位大神请教!