PHP中的session,不仅可以通过文件和cookie来操作,当网站访问量过大的时候,用数据库来存储session信息是最高效的,下面是我的测试代码,仅供参考!
<?php
class Session{
//session有效时长
static public $maxtime;
//指定session数据表
static public $table;
//初始化
static function run($maxtime, $table){
if(ini_get(‘session.save_handler’)==’user’ || ini_set(‘session.save_handler’, ‘user’)){
session_set_save_handler(
array(__CLASS__, ‘start’),
array(__CLASS__, ‘close’),
array(__CLASS__, ‘read’),
array(__CLASS__, ‘write’),
array(__CLASS__, ‘destroy’),
array(__CLASS__, ‘gc’)
);
}
self::$maxtime = $maxtime ? $maxtime : 1000;
self::$table = $table ? $table : ‘photos_session’;
//开启session会话控制
session_start();
}
//开
static function start($path, $session_name){
return true;
}
//关
static function close(){
self::gc();
session_unset();
session_destroy();
return true;
}
//读
static function read($sid){
$sql = ‘select * from ‘.self::$table.’ where session_id=’.”‘$sid’”;
$sessionObj = Db::$db->query($sql);
$sessionArry = $sessionObj->fetchAll(PDO::FETCH_ASSOC);
return count($sessionArry)>0 ? $sessionArry[0][‘data’] : 0;
}
//写
static function write($sid, $data){
//获取当前seesion_id();
$sid = session_id();
//获取当前时间
$nowtime = time();
//判断当前用户session是否已经存在
$sql = ‘select * from ‘.self::$table.’ where session_id=”‘.$sid.’”‘;
$sessionObj = Db::$db->query($sql);
$sessionArry = $sessionObj->fetchAll(PDO::FETCH_ASSOC);
//如果已经存在就update,如果不存在就insert
if(count($sessionArry)>0){
$sql = ‘update ‘.self::$table.’ set data=’.”‘$data’”.’, nowtime=’.”‘$nowtime’”.’ where session_id=’.”‘$sid’”;
Db::$db->query($sql);
}else{
$sql = ‘insert into ‘.self::$table.’ set data=’.”‘$data’”.’, session_id=’.”‘$sid’”.’, nowtime=’.”‘$nowtime’”;
Db::$db->query($sql);
}
}
//卸
static function destroy($sid){
$sql = ‘delete from ‘.self::$table.’ where session_id=’.”‘$sid’”;
Db::$db->query($sql);
}
//垃
static function gc(){
$nowtime = time();
$sql = ‘delete from ‘.self::$table.’ where time<‘.($nowtime-self::$maxtime);
Db::$db->query($sql);
}
}
熟悉面向对象的模式,采用PDO连接数据库。
以上源码用到了数据连接,是我自己封装的一个类,源码查看《PHP封装MYSQL数据库操作类源码》。将源码复制粘贴到一个php文件中,直接调用即可使用!
发表回复