mysql内存表替代方案_使用mysql内存表来代替php session的类

这段代码实现了一个自定义的会话管理类,它允许使用MySQL或Memcache代替默认的PHP会话存储。类包括初始化、加载、设置和获取会话变量的方法,并且在会话超时时进行清理。示例中展示了如何与MySQL数据库进行交互来存储和检索会话数据。
摘要由CSDN通过智能技术生成

/**

@Usage: use some other storage method(mysql or memcache) instead of php sessoin

@author:lein

@Version:1.2

*/

session_start();

if(!isset($_SESSION['test'])){

$_SESSION['test']="123_lein_".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;

//session coolie name

private $sessionCookieName;

public function session($engineBase=NULL,$engineName='mysql',$storage_name='php_session'){

try{

$this->sessionexpiredTime = intval(ini_get("session.cache_expire"))*10;//默认是180分钟,太长了,改为了30分钟

}catch(Exception $Exception){

$this->sessionexpiredTime = 1200;

}

try{

$this->sessionCookieName = ini_get("session.name");

}catch(Exception $Exception){

$this->sessionCookieName = 'PHPSESSID';

}

if(!isset($_COOKIE[$this->sessionCookieName])){

@session_start();

$this->sessionID=session_id();

}else{

$this->sessionID=$_COOKIE[$this->sessionCookieName];

}

$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->loadFromSession();

$this->engine->refresh();

$this->engine->cleanup();

}

private function init()

{

$this->data = $this->engine->get();

if(empty($this->data)){

@session_start();

if(!empty($_SESSION)){

$this->data = $_SESSION;

$this->engine->create(false, $this->data);

}

else

{

$this->engine->create(false, "");

}

}

}

public function loadFromSession($flagStartSession = false){

$flag=false;

if($flagStartSession){

@session_start();

}

if($_SESSION&&is_array($_SESSION)){

foreach($_SESSION as $k=>$v){

if(!isset($this->data[$k])){

$this->data[$k] = $v;

$flag=true;

}

}

}

if($flag){

$this->engine->set(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);

}

private function __isset($nm)

{

return isset($this->data[$nm]);

}

private function __unset($nm)

{

unset($this->data[$nm]);

$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(empty($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(!empty($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.' where date_add(`time`,INTERVAL '.$this->expire_time.' SECOND)

}else{

$sql = 'delete from '.$this->storage_name_slow.' where `time`+'.$this->expire_time.'

if($_SESSION['username']=="leinchu"){

echo $sql;

}

$this->execute($sql);

$sql = 'delete from '.$this->storage_name.' where `time`+'.$this->expire_time.'

if($_SESSION['username']=="leinchu"){

echo $sql;

}

}

$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)

{

if($this->mysql_version>4){

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.'/',id="'.$key.'",`time`=unix_timestamp()';

}

$return = $this->execute($sql);

if(!$return){

$this->initTable();

$return = $this->execute($sql,true);

}

return $return;

}

public function set($key="",$value=""){

if($key=="") $key = $this->id;

if($value != "") $value = mysql_real_escape_string(serialize($value),$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.'/',id="'.$key.'",`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',

PRIMARY KEY (`id`),

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,

`time` int(10) not null default '0',

PRIMARY KEY (`id`),

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."
";

?>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值