将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一样了