コードをコピー コードは次のとおりです:
/**
@Usage: php sessoin の代わりに他のストレージ方法 (mysql または memcache) を使用します
@author:lein
@Version:1.0
*/
session_start();
if(!isset($_SESSION['test'])){
$_SESSION['test']="123_lein_".date("Y-m-d H:i:s");
}
クラスセッション{
//セッションデータ
private $data;
//engine,mysql または memcache
private $engine;
//php セッションの有効期限
private $sessionexpiredTime;
//現在のユーザーのセッション Cookie 値
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 テーブル名または memcahce キー;
'expire_time'= >$this->sessionexpiredTime,
'data_too_long_instead_value' => '{__DATA IS *$* TO LONG__}'
),
$this->sessionID,
&$engineBase;
);
$this->init();
$this->engine->refresh();
$this->engine->cleanup();
}
プライベート関数 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);
}
}
プライベート関数 __get($nm)
{
if (isset($this->data[$nm])) {
$r = $this ->データ[$nm];
$r を返します;
}
else
{
NULL を返す;
}
}
プライベート関数 __set($nm, $val)
{
$this->data[$nm] = $val;
$this->engine->set(false, $this->data);
}
関数 __destruct(){
$this->data = NULL;
$this->engine->close();
$this->engine = NULL;
}
}
インターフェース SessionEngine
{
/*
* 変数を設定
* @param $arr array,array(変数名=>変数値,...)
*/
パブリック関数 setVariable($arr);
/*
* セッション値を取得
* @param $key string
*/
public function get($key="");
/*
* セッション値を設定します
* @param $key string
* @param $value string
*/
public function set($key="",$value) ="");
/*
* セッション値を設定します
* @param $key string
* @param $value string
*/
public function create($key="",$value) ="");
/*
* セッションの無効な時間を更新します
* @param $key string
*/
public functionfresh($key="");
/*
* mysql または memcache 接続を閉じる
*/
public function close();
/*
* 期限切れのセッションを削除
*/
public function cleanup();
}
最終クラス mysqlSessionEngine は 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__}';//データが $max_session_data_length より長く、mysql 4 以下を使用している場合は、代わりにこの値をメモリ テーブルに挿入します。
プライベート $expire_time=1200;
プライベート $max_session_data_length = 2048;
プライベート $conn;
プライベート $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__.": セッションのCookie 名を空にすることはできず、32 文字のみにする必要があります!");
}
$this->conn = $_conn;
if(!$this->conn||!is_resource($this->conn)){
throw new Exception(__FILE__."->".__LINE__.": mysql 接続が必要です。 ");
}
$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,"存在しません")!==false)
{
$this->initTable();
}
$return = array();
}
else
{
$return = unserialize($return);
}
return $return;
}
パブリック関数 close(){
@mysql_close($this->conn);
}
public function cleanup(){
if($this->mysql_version>4){
$sql = '.$this->storage_name から削除します。' while date_add(time,INTERVAL '.$this->expire_time.' SECOND)
$sql = '.$this->storage_name から削除します。' while 時間 '.$this->expire_time.'
$this->execute($sql);
}
public functionfresh($key=""){
if($this->mysql_version>4){
$sql = 'update '.$this->storage_name. ' set time=CURRENT_TIMESTAMP() where id="'.$key.'"';
}else{
$sql = '.$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__.": セッション データが最大許容長を超えています(".$this-> ;max_session_data_length.")!");
if($this->mysql_version>4){
$sql = '.$this->storage_name.' に置き換えます。 set value=''.$value.'',id="'.$key.'",time=CURRENT_TIMESTAMP()';
}else{
$sql = '.$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 = '更新'.$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__.": セッション データが最大許容長 (".$this->max_session_data_length.")!") を超えています。
}
$sql = '.$this->storage_name_slow.' に置き換えます。 set value=''.$value.'',id="'.$key.'",time=unix_timestamp()';
$this->execute($sql,true);
$sql = '更新'.$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;
}
プライベート関数 initTable(){
if($this->mysql_version>4){
$sql = "
存在しない場合は CREATE TABLE `".$this-> ;storage_name."` (
`id` char(32) NOT NULL デフォルト 'ERR',
`value` VARBINARY(".$this->>max_session_data_length.") NULL,
`time`タイムスタンプ NOT NULL 更新時のデフォルト CURRENT_TIMESTAMP CURRENT_TIMESTAMP、
PRIMARY KEY (`id`)、
KEY `time` (`time`)
) ENGINE=MEMORY
";
}else{
$sqlSlow = "
存在しない場合はテーブルを作成します `".$this->storage_name."_slow` (
`id` char(32) NOT NULL デフォルト 'ERR '、
`value` text NULL、
`time` int(10) not null デフォルト '0'、
PRIMARY KEY (`id`)、
KEY `time` (`time` )
) ENGINE=MyISAM
;
$this->execute($sqlSlow,true);
$sql = "
存在しない場合はテーブルを作成します `".$this->storage_name."` (
`id` char(32) NOT NULL デフォルト 'ERR',
`value` VARCHAR(255) NULL、
`time` int(10) not null デフォルト '0'、
PRIMARY KEY (`id`)、
KEY `time` (`time`)
) エンジン = メモリ
;
}
return $this->execute($sql,true);
}
プライベート関数execute($sql,$die=false)
{
if($die)
{
mysql_query($sql,$this->conn)または die("exe SQL error:
".mysql_error()."
".$sql."