session 保存数据库
- 在服务器上,所有的网站都在使用同样的临时目录,就意味着多个程序在同一个位置进行文件的读取操作,那么我们可以利用技术编写一个程序来读取临时目录所有的数据,显然这样就有很大的安全隐患。如果有多台服务器,那么共享信息就很困难了。
- 有时候我们需要长期保存SESSION数据,将SESSION缓存保存在临时文件就不可取了,而且随着SESSION的增多,也会增加服务器的负担,对服务器性能优化是很不利的。
- 而解决SESSION的问题最好的方案无非就是利用PHP将SESSION会话保存到数据库,作为独立网站的 SESSION 会话状态,和其它网站的临时目录会话分隔开,不仅安全性会提高许多,而且也提高程序的规范性,使得网站的 SESSION 会话能够统一进行管理操作。
一、PHP 写一个会话类:sessionmysql.class.php
class session
{
private $_lifetime;
private $_db;
private $_table;
private $_userid;
private $_domain = _COOKIE_DOMAIN_;
function __construct($etdbhandler, $lifetime = 1440, $userid = 0)
{
$this->_table = 'joe_sessions';
$domain = $this->_domain;
ini_set('session.cookie_domain', "$domain");
$this->_db = $etdbhandler;
$this->_lifetime = $lifetime;
$this->_userid = $userid;
@ini_set('session.save_handler', 'user');
$flag = session_set_save_handler(
array(&$this,'open'),
array(&$this,'close'),
array(&$this,'read'),
array(&$this,'write'),
array(&$this,'destroy'),
array(&$this,'gc')
);
if (! session_id()) {
session_start();
}
}
function open($save_path, $session_name)
{
return true;
}
function close()
{
return true;
}
function read($id)
{
$sql = "SELECT SessionData FROM $this->_table WHERE SessionId=:id";
$array = array(
':id' => $id
);
$result = $this->_db->queryOne($sql, $array);
}
function write($id, $data)
{
$ip = addslashes(funcPunlic::getIp());
$data = addslashes($data);
if (strlen($data) > 500)
$data = '';
$times = time();
$etimes = $times + $this->_lifetime;
$data = array(
'SessionId' => "$id",
'UserId' => $this->_userid,
'Ip' => "$ip",
'LastVisit' => "$times",
'Expiration' => "$etimes",
'SessionData' => "$data",
);
return $this->_db->insert($this->_table, $data);
}
function destroy($id)
{
$where = array(
'SessionId' => "$id",
);
return $this->_db->delete($this->_table, $where);
}
function gc($maxlifetime)
{
$times = time();
$where = array(
'Expiration' => "Expiration<$times",
);
return $this->_db->delete($this->_table,$where);
}
}
二、数据库设计
CREATE TABLE `joe_sessions` (
`SessionId` varchar(32) NOT NULL,
`UserId` int(10) unsigned NOT NULL DEFAULT '0',
`Ip` varchar(100) DEFAULT NULL,
`LastVisit` int(10) unsigned NOT NULL DEFAULT '0',
`Expiration` int(10) unsigned NOT NULL DEFAULT '0',
`SessionData` varchar(500) NOT NULL,
PRIMARY KEY (`SessionId`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8 COMMENT='session表';