用mysql内存表来代替php session的类

<div class="codetitle"><a style="CURSOR: pointer" data="3777" class="copybut" id="copybut3777" onclick="doCopy('code3777')"> 代码如下:

<div class="codebody" id="code3777">
<?PHP
/*
@Usage: use some other storage method(MysqL or memcache) instead of PHP sessoin
@author:lein
@Version:1.0
/
session_start();
if(!isset($_SESSION['test'])){
$_SESSION['test']="123lein".date("Y-m-d H:i:s");
} class session{ //session data
private $data;
//engine,MysqL or memcache
private $engine;
//PHP session expire time
private $sessionexpiredTime;
//current user's session cookie value
private $sessionID; public function session($engineBase=NULL,$engineName='MysqL',$storage_name='PHP_session'){
try{
$this->sessionexpiredTime = intval(ini_get("session.cache_expire"))60;
}catch(Exception $Exception){
$this->sessionexpiredTime = 1200;
}
@session_start();
$this->sessionID=session_id();
$className = $engineName."SessionEngine";
$this->engine = new $className(
array(
'storage_name'=>$storage_name,//MysqL table name or memcahce key which stores data;
'expire_time'=>$this->sessionexpiredTime,
'data_too_long_instead_value' => '{__DATA IS
$ TO LONG}'
),
$this->sessionID,
&$engineBase
);
$this->init();
$this->engine->refresh();
$this->engine->cleanup();
}
private function init()
{
$this->data = $this->engine->get();
if(emptyempty($this->data)&&!emptyempty($_SESSION)){
$this->data = $_SESSION;
$this->engine->create(false,$this->data);
}
else if(emptyempty($this->data))
{
$this->engine->create(false,$this->data);
}
}
private function
get($nm)
{
if (isset($this->data[$nm])) {
$r = $this->data[$nm];
return $r;
}
else
{
return NULL;
}
}
private function set($nm,$val)
{
$this->data[$nm] = $val;
$this->engine->set(false,$this->data);
}
function
destruct(){
$this->data = NULL;
$this->engine->close();
$this->engine = NULL;
}
} interface SessionEngine
{
/

set varibles
@param $arr array,array(varible name=>varible value,...)
/
public function setvariable($arr);
/

get session value
@param $key string
/
public function get($key="");
/

set session value
@param $key string
@param $value string
/
public function set($key="",$value="");
/
set session value
@param $key string
@param $value string
/
public function create($key="",$value="");
/

update the session's invalid time
@param $key string
/
public function refresh($key="");
/

close MysqL or memcache connection
/
public function close();
/
delete expired sessions
*/
public function cleanup();
} final class MysqLSessionEngine implements SessionEngine{
private $id="";
private $storage_name='PHP_session';
private $storage_name_slow='PHP_session_slow';
private $data_too_long_instead_value = '{DATA IS ~ TO LONG}';//if data is longer than $max_session_data_length and you are using MysqL 4 or below,insert this value into memery table instead.
private $expire_time=1200;
private $max_session_data_length = 2048;
private $conn;
private $MysqL_version;
public function MysqLSessionEngine($arr=array(),$key="",&$_conn){
$this->setvariable($arr);
$this->id = $key;
if(emptyempty($this->id)||strlen($this->id)!=32){
throw new Exception(FILE."->".LINE.": Session's cookie name can't be empty and it must have just 32 charactors!");
}
$this->conn = $_conn;
if(!$this->conn||!is_resource($this->conn)){
throw new Exception(FILE."->".LINE.": Need a MysqL connection!");
}
$this->MysqL_version = $this->getone("select floor(version())");
if($this->MysqL_version<5){
$this->max_session_data_length = 255;
}
}
public function setvariable($arr){
if(!emptyempty($arr)&&is_array($arr)){
foreach($arr as $k=>$v){
$this->$k = $v;
if($k=='storage_name'){
$this->storage_name_slow = $v.'_slow';
}
}
}
}
public function get($key=""){
if($key=="") $key = $this->id;
$return = $this->getone('select value from '.$this->storage_name.' where id="'.$key.'"');
if($return==$this->data_too_long_instead_value)
{
$return = $this->getone('select value from '.$this->storage_name_slow.' where id="'.$key.'"');
}
if(!$return)
{
$MysqLError = MysqL_error($this->conn);
if(strpos($MysqLError,"doesn't exist")!==false)
{
$this->initTable();
}
$return = array();
}
else
{
$return = unserialize($return);
}
return $return;
}
public function close(){
@MysqL_close($this->conn);
}
public function cleanup(){
if($this->MysqL_version>4){
$sql = 'delete from '.$this->storage_name.' while date_add(time,INTERVAL '.$this->expire_time.' SECOND)<CURRENT_TIMESTAMP()';
}else{
$sql = 'delete from '.$this->storage_name.' while time+'.$this->expire_time.'<unix_timestamp()';
}
$this->execute($sql);
}
public function refresh($key=""){
if($this->MysqL_version>4){
$sql = 'update '.$this->storage_name.' set time=CURRENT_TIMESTAMP() where id="'.$key.'"';
}else{
$sql = 'update '.$this->storage_name.' set time=unix_timestamp() where id="'.$key.'"';
}
$return = $this->execute($sql);
if(!$return){
$this->initTable();
$return = $this->execute($sql,true);
}
return $return;
}
public function create($key="",$value=""){
if($key=="") $key = $this->id;
if($value != "") $value = MysqL_real_escape_string(serialize($value),$this->conn);
if(strlen($value)>$this->max_session_data_length) throw new Exception(FILE."->".LINE.": Session data is long than max allow length(".$this->max_session_data_length.")!");
if($this->MysqL_version>4){
$sql = 'replace into '.$this->storage_name.' set value=\''.$value.'\',id="'.$key.'",time=CURRENT_TIMESTAMP()';
}else{
$sql = 'replace into '.$this->storage_name.' set value=\''.$value.'\',time=unix_timestamp()';
}
$return = $this->execute($sql);
if(!$return){
$this->initTable();
$return = $this->execute($sql,true);
}
return $return;
}
public function set($key="",$this->conn);
$sql = 'update '.$this->storage_name.' set value=\''.$value.'\' where id="'.$key.'"';
if(strlen($value)>$this->max_session_data_length)
{
if($this->MysqL_version>4){
throw new Exception(FILE."->".LINE.": Session data is long than max allow length(".$this->max_session_data_length.")!");
}
$sql = 'replace into '.$this->storage_name_slow.' set value=\''.$value.'\',time=unix_timestamp()';
$this->execute($sql,true);
$sql = 'update '.$this->storage_name.' set value=\''.$this->data_too_long_instead_value.'\' where id="'.$key.'"';
}
$return = $this->execute($sql);
if(!$return){
$this->initTable();
$return = $this->execute($sql,true);
}
return $return;
}
private function initTable(){
if($this->MysqL_version>4){
$sql = "
CREATE TABLE if not exists ".$this->storage_name." (
id char(32) NOT NULL default 'ERR',
value VARBINARY(".$this->max_session_data_length.") NULL,
time timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
PRIMARY KEY (id),
KEY time (time)
) ENGINE=MEMORY;
";
}else{
$sqlSlow = "
CREATE TABLE if not exists ".$this->storage_name."_slow (
id char(32) NOT NULL default 'ERR',
value text NULL,
time int(10) not null default '0',
KEY time (time)
) ENGINE=MyISAM;
";
$this->execute($sqlSlow,true); $sql = "
CREATE TABLE if not exists ".$this->storage_name." (
id char(32) NOT NULL default 'ERR',
value VARCHAR(255) NULL,
KEY time (time)
) ENGINE=MEMORY;
";
}
return $this->execute($sql,true);
}
private function execute($sql,$die=false)
{
if($die)
{
MysqL_query($sql,$this->conn) or die("exe sql error:
".MysqL_error()."
".$sql."");
}
else
{
MysqL_query($sql,$this->conn); if(MysqL_error()){
return false;
}else{
return true;
}
}
}
private function getone($sql,$die=false){
$rs = $this->query($sql,$die);
if($rs && ($one = MysqL_fetch_row($rs)) ){
return $one[0];
}else{
return false;
}
}
private function query($sql,$die=false){
if($die)
$rs = MysqL_query($sql,$this->conn) or die("query sql error:
".MysqL_error()."
".$sql."");
else
$rs = MysqL_query($sql,$this->conn);
return $rs;
}
} $lnk = MysqL_connect('localhost','root','123456')
or die ('Not connected : ' . MysqL_error()); // make foo the current db
MysqL_select_db('test',$lnk) or die ('Can\'t use foo : ' . MysqL_error());
$S = new session($lnk);
if(!$S->last){
$S->last = time();
}
echo "First visit at ".$S->last."
";
if(!$S->lastv){
$S->lastv = 0;
}
$S->lastv++;
echo "lastv=".$S->lastv."
";
echo "test=".$S->test."
";
if(isset($_GET['max'])){
$S->boom = str_repeat("OK",255);
}
if(isset($_GET['boom'])){
$S->boom = $_GET['boom'];
}
echo "boom=".$S->boom."
";
?>

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...