复制代码 代码如下:
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$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)}else{ 
$sql = 'delete from '.$this->storage_name.' while time+'.$this->expire_time.'} 
$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.'\',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.
; 
?>
http://www.bkjia.com/phpjc/319803.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/319803.htmltecharticle复制代码 代码如下: ?php /** @usage: use some other storage method(mysql or memcache) instead of php sessoin @author:lein @version:1.0 */ session_start(); if(!isset($_sessio...
   
 
   