使用数据库保存session的方法,阅读使用数据库保存session的方法,php的session默认是以文件方式保存在服务器端,并且在客户端使用cookie保存变量,这就会出现一个问题,当一个用户由于某种安全原因关闭了浏览器的cookie,程序中的session相关操作将无法执行。
因此,如果能以数据库保存session数据,将不受客户端设置的限制,并且在性能和扩展性等方面有一个飞跃。程序中使用关键函数是session_set_save_handler
,同时要将php.ini
里的session.save_handler = files
改为 user
。这里我们讨论的环境是linux+nginx+mysql+php
。
存储session数据的表结构如下:
CREATE TABLE `sessions` (
`skey` char(32) NOT NULL,
`expiry` int(11) unsigned NOT NULL,
`svalue` text NOT NULL,
PRIMARY KEY (`skey`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
<?php
/**
* Created by PhpStorm.
* User: leyan
* Date: 2016/6/12
* Time: 10:44
*/
class MySessionHandler implements SessionHandlerInterface
{
public $mysqli;
public $EXPIRE_TIME = 3600;//过期时间
function open($save_path, $session_id)
{
// TODO: Implement open() method.
$this->mysqli = new Mysqli("localhost","root","root","test");
if ( mysqli_connect_errno ()) {
printf ( "Connect failed: %s\n" , mysqli_connect_error ());
exit();
}
return true;
}
function read($session_id)
{
// TODO: Implement read() method.
$res = $this->mysqli->query("select svalue from sessions where skey = $session_id");
//$row = $res->fetch_assoc();
return $res;
}
function write($session_id, $session_data)
{
// TODO: Implement write() method.
$expiry = time()+$this->EXPIRE_TIME;
$sql = "insert into sessions (svalue,skey,expiry)values('$session_data','$session_id',$expiry)";
$this->mysqli->query($sql);
return true;
}
//当session.gc_probability/session.gc_divisor == 1的时候会执行回收机制gc()
function gc($maxlifetime)
{
// TODO: Implement gc() method.
$sql = 'delete from sessions where expiry < '.time();
$this->mysqli->query($sql);
return true;
}
function close()
{
// TODO: Implement close() method.
return true;
}
function destroy($session_id)
{
// TODO: Implement destroy() method.
$this->mysqli->query("delete from sessions where skey = $session_id");
return true;
}
}
$handler = new MySessionHandler();
session_set_save_handler($handler,true);
session_start();
#完成上面的代码之后就可以进行正常的session操作,而数据是保存在数据库中的
//destory
unset($_SESSION['first']);
//session_destroy();
//write
$_SESSION['first'] = 'test_one';
//read
echo $_SESSION['first'];