mysql メモリ テーブルを使用して php セッションを置き換える class_PHP チュートリアル

WBOY
リリース: 2016-07-21 15:48:09
オリジナル
835 人が閲覧しました

コードをコピーします コードは次のとおりです:

/**
@使用法: 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;

パブリック関数 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' => '{__データは *$* が長すぎます__}'
)、
$this->セッションID、
&$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->data[$nm];
$r を返す;
}
else
{
NULL を返す;
}
}
プライベート関数 __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
{
/*
* 変数の設定
* @param $arr array,array(variable name=>variable value,...)
*/
public function 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();
}

final クラス 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;
パブリック関数 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=='ストレージ名'){
$this->ストレージ名_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)}else{
$sql = '.$this->storage_name.' から削除します。 while time+'.$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;
}
パブリック関数 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 = "
CREATE TABLE if not存在 `".$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 = "
CREATE TABLE if not存在 `".$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`)
) ENGINE=MEMORY
";
}
return $this->execute($sql,true);
}
プライベート関数execute($sql,$die=false)
{
if($die)
{
mysql_query($sql,$this->conn) または die("exe Sql error:
".mysql_error()."
".$sql."
");
}
else
{
mysql_query($sql,$this->conn);

if(mysql_error()){
return false;
}else{
true を返します。
}
}
}
プライベート関数 getOne($sql,$die=false){
$rs = $this->query($sql,$die);
if($rs && ($one = mysql_fetch_row($rs)) ){
return $one[0];
}else{
false を返す;
}
}
プライベート関数 query($sql,$die=false){
if($die)
$rs = mysql_query($sql,$this->conn) または die("クエリ SQL エラー:
"。 mysql_error()."
".$sql."
");
else
$rs = mysql_query($sql,$this->conn);
$rsを返します;
}
}

$lnk = mysql_connect('localhost', 'root', '123456')
or die ('接続されていません : ' .mysql_error());

// foo を現在のデータベースにする
mysql_select_db('test', $lnk) or die ('Can't use foo : ' . mysql_error());
$S = 新しいセッション($lnk);
if(!$S->last){
$S->last = time();
}
echo "「.$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['ブーム'])){
$S->ブーム = $_GET['ブーム'];
}
echo "boom=".$S->boom."
";
?>

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/319803.html技術記事例: ?php /**@Usage: php sessoin @author:lein @Version:1.0 の代わりに、他のストレージ方法 (mysql または memcache) を使用してください。*/ session_start(); if(!isset($_SESSIO...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート