本文实例讲述了php使用mysql保存session会话的方法。分享给大家供大家参考。具体分析如下:
在很多大的系统中一般都有这个功能,但是要分离出来分析,网上靠谱的资料也不太多 这里我整理了一篇发出来与大家分享
使用mysql保存session会话较files有很多优点:
1) 有利于分布式系统,files只能保存在一台机器上
2) 有利于大访问量的系统,使用files时每个session保存在一个文件中,目录会超级大,查找session文件会比较困难。
//////使用mysql保存会话首先要创建session表:
<?php
$hostname_login = "localhost"; // server address
$username_login = "root"; // user name
$password_login = ""; // password
//
$data_name = "session"; // database name
$login = mysql_pconnect($hostname_login, $username_login, $password_login) or trigger_error(mysql_error(),e_user_error);
$sql="show databases like '".$data_name."'"; // if it is exist
if($rs_table=mysql_query($sql,$login)) {
if($rs_value=mysql_fetch_array($rs_table)) {
echo "数据库已经存在!n!";
exit();
}
}
$sql="create database $data_name";
mysql_query($sql); // crate database
echo "数据库创建成功!n";
mysql_select_db($data_name, $login);
$sql="create table `sessions` (
`sessionkey` varchar(32) not null default '',
`sessionarray` blob not null,
`sessionexptime` int(20) unsigned not null default '0',
primary key (`sessionkey`),
key `sessionkey` (`sessionkey`)
) engine=myisam default charset=utf8"; //新建数据库 sql语句
mysql_query($sql);
echo "成功新建数据库表!";
?>
/////////mysqlsession 类如下:
<?php
class mysqlsession {
// 注意在有使用session的页面。页面一定要顶格,页面开始处不能留空。
private $db_server = "localhost"; // 数据库服务器主机名
private $db_name = ""; // 数据库名字
private $db_user = "root"; // mysql 数据库访问用户名
private $db_pass = ""; // mysql 数据库访问密码
private $db_select_db = "";
//private $sess_life = 1440; // session的最大使用时长,单位秒。
private $sess_life = 0;
function mysqlsession (&$sessiondb) {
//session_write_close();
$this->db_name = &$sessiondb;
$this->sess_life = get_cfg_var("session.gc_maxlifetime");
session_module_name('user');
session_set_save_handler(
array(&$this, 'sess_open'),
array(&$this, 'sess_close'),
array(&$this, 'sess_read'),
array(&$this, 'sess_write'),
array(&$this, 'sess_destroy'),
array(&$this, 'sess_gc')
);
session_start();
}
function sess_open($save_path, $session_name){ // 打开数据库连接
if (! $this->db_select_db = mysql_pconnect($this->db_server, $this->db_user, $this->db_pass)) {
echo "sorry! mysql error : can't connect to $this->db_server as $db_user";
echo "mysql error: ", mysql_error();
die;
}
if (! mysql_select_db($this->db_name, $this->db_select_db)) {
echo "sorry! mysql error : unable to select database $this->db_name";
die;
}
return true;
}
function sess_close() {
return true;
}
function sess_read($sessionkey){
$query = "select sessionarray from sessions where sessionkey = '".$sessionkey."' and sessionexptime > " . time();
// 过期不读取。
$result = mysql_query($query, $this->db_select_db);
if (list($sessionarray) = mysql_fetch_row($result)) {
return $sessionarray;
}
return false;
}
function sess_write($sessionkey, $varray) {
$sessionexptime = time() + $this->sess_life;
// 更新session过期时间,
//session过期时间 = 最后一次更新时间 + session的最大使用时长
$sessionarray = addslashes($varray);
$query = "insert into sessions (sessionkey,sessionexptime,sessionarray) values ('".$sessionkey."','".$sessionexptime."','".$sessionarray."')";
$result = mysql_query($query, $this->db_select_db);
if (!$result){
$query = "update sessions set sessionexptime = '".$sessionexptime."', sessionarray = '".$sessionarray."' where sessionkey = '".$sessionkey."' and sessionexptime > " . time();
$result = mysql_query($query, $this->db_select_db);
}
return $result;
}
function sess_destroy($sessionkey) {
$query = "delete from sessions where sessionkey = '".$sessionkey."'";
$result = mysql_query($query, $this->db_select_db);
return $result;
}
function sess_gc($maxlifetime) {
// 这个垃圾清除器系统调用。
//默认是1440秒清除一次。参数可以在php.ini里面设置。
$query = "delete from sessions where sessionexptime < " . time();
$result = mysql_query($query, $this->db_select_db);
return mysql_affected_rows($this->db_select_db);
}
}
?>
//用法:在原来使用 session_start 的地方,替换成 $session = new mysqlsession ()
//注意:包含此程序前要打开数据库,主程序退出前不能关闭数据库,否则会出错。
希望本文所述对大家的php程序设计有所帮助。
【说明】:本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!