-
- /**
- * session mysql内存表
- @Usage: php sessoinの代わりに他のストレージメソッド(mysqlまたはmemcache)を使用してください
- @author:lein
- @Version:1.2
- */
- session_start();
- if(!isset($_SESSION['test'])){
- $_SESSION['test']="123_lein_".date("Y-m-d H:i:s");
- }
-
- class session{
- //セッションデータ
- private $data;
- //engine、mysql または memcache
- private $engine;
- //php セッションの有効期限
- private $sessionexpiredTime;
- //現在のユーザーのセッション Cookie 値
- private $sessionID;
- //セッションクーリー名
- 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 テーブル名または memcahce キー;
- '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();
- }
- プライベート関数 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, "");
- }
- }
- }
- パブリック関数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 ->データ[$k] = $v;
- $flag=true;
- }
- }
- }
- if($flag){
- $this->engine->set(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);
- }
-
- プライベート関数 __isset($nm)
- {
- return isset($this->data[$nm]);
- }
-
- プライベート関数 __unset($nm)
- {
- unset($this->data[$nm]);
- $this->engine->set(false, $this->data);
- }
-
- 関数 __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=""; を実装します。
- プライベート $storage_name='php_session';
- プライベート $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(empty($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(!empty($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 から削除します。' where date_add(`time`,INTERVAL '.$this->expire_time.' SECOND) }else{
- $sql = '.$this->storage_name_slow.' から削除します。ここで、 `time`+'.$this->expire_time.' if($_SESSION['username']=="ラインチュ"){
- echo $sql;
- }
- $this->execute($sql);
- $sql = '.$this->storage_name から削除します。'ここで、 `time`+'.$this->expire_time.' if($_SESSION['username']=="ラインチュ"){
- echo $sql;
- }
- }
- $this->execute($sql);
- }
- public function reports($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)
- {
- if($this->mysql_version>4){
- 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`)
- ) 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()){
- 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 エラー:< br>".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."
";
- ?>
复制代
|