首先我们先说的是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"];
有什么不对的还请各位大神请教!