将SESSION数据变量存储于服务器是端是一种较安全的做法,但是设想一下,像校内网这样的日访问量过亿,拥有用户几千万的大型网站,如果将所有用户SESSION数据全部存储于服务器端,将消耗巨大的服务器资源。所以程序员在制作大型网站时将SESSION存储于服务器端虽然安全,但却不是最好的选择。如果将SESSION数据存储于数据库中,那么就可以减轻服务器的压力同时数据也是比较安全的。
php程序如何将session数据存入数据库中呢?php程序在设计的时候给session预留了一个接口,我们可以通过 SessionHandlerInterface 这个接口 来实现自定义session机制,将session存入数据库中。代码如下:
<?php
class customerSession implements SessionHandlerInterface{
private $lifetime;
private $link;
public function open($save_path, $name)
{
$this->lifetime=get_cfg_var('session.gc_maxlifetime');
$this->link = mysqli_connect('localhost','root','root','test');
if ($this->link){
mysqli_set_charset($this->link,'UTF8');
return true;
}
return false;
}
public function write($session_id, $session_data)
{
$session_id = mysqli_escape_string($this->link,$session_id);
$sql = "SELECT * FROM session WHERE session_id ='{$session_id}'";
$res = mysqli_query($this->link,$sql);
$expires = time()+$this->lifetime;
if (mysqli_num_rows($res)==1){
$sql = " UPDATE session SET session_data = '{$session_data}',expires = {$expires} WHERE session_id = '{$session_id}'";
}else{
$sql = " INSERT session VALUES('{$session_id}','{$session_data}','{$expires}')";
}
mysqli_query($this->link,$sql);
return mysqli_affected_rows($this->link)==1;
}
public function read($session_id)
{
$session_id = mysqli_escape_string($this->link,$session_id);
$sql = " SELECT * FROM session WHERE session_id = '{$session_id}'";
$Rres = mysqli_query($this->link,$sql);
if (mysqli_num_rows($Rres)==1){
return mysqli_fetch_assoc($Rres)['session_data'];
}
return '';
}
public function destroy($session_id)
{
$session_id = mysqli_escape_string($this->link,$session_id);
$sql = " DELETE FROM session WHERE session_id = '{$session_id}'";
mysqli_query($this->link,$sql);
return mysqli_affected_rows($this->link)==1;
}
public function gc($maxlifetime)
{
$sql = " DELETE FROM session WHERE expires<".time();
mysqli_query($this->link,$sql);
if (mysqli_affected_rows($this->link)>0){
return true;
}
return false;
}
public function close()
{
mysqli_close($this->link);
return true;
}
}mysqli_connect('localhost','root','root','test') 这里是session准备存储的数据库相关信息。
session的表结构图:

表中三个字段的意思:session_id 就是常规session的id ,session_data 是存储到数据表中的session数据,session数据在数据表中的存储形式如下图:

expires:可以理解为session的过期时间,不过这个时间由session存入表的那一刻时间加上session数据的有效时间长短 最后得到的值。
将session存入数据库的类已经写好了,该怎么用呢:
<?php
#session存入数据库 的使用方法
require_once 'customerSession.php';
$CustomerSession = new customerSession();
ini_set('session.save_handler','user');
session_set_save_handler($CustomerSession,true);
session_start();在使用的时候先引入上面创建的session自定义操作类,然后实例化,上面的使用方法中,除了自定义类的类名外,其他的内容都不能改,也不能少。
接下来的就可以和我们平常使用session一样了

