-
-
/**
- * 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");
- }
-
- 수업 세션{
- //세션 데이터
- private $data;
- //엔진,mysql 또는 memcache
- private $engine;
- //php 세션 만료 시간
- private $sessionexpiredTime;
- //현재 사용자의 세션 쿠키 값
- private $sessionID;
- //세션 쿨리 이름
- private $sessionCookieName;
- 공용 함수 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){
- $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는 *$* TO LONG__}'
- ),
- $this->sessionID,
- &$engineBase
- );
- $this->init();
- $this->loadFromSession();
- $this->엔진->refresh();
- $this->엔진->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->data[$k] = $v;
- $플래그=true;
- }
- }
- }
- if($flag){
- $this->engine->set(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);
- }
-
- 비공개 함수 __isset($nm)
- {
- return isset($this->data[$nm]);
- }
-
- 비공개 함수 __unset($nm)
- {
- unset($this->data[$nm]);
- $this->engine->set(false, $this->data);
- }
-
- function __destruct(){
- $this->data = NULL;
- $this->엔진->close();
- $this->엔진 = NULL;
- }
- }
-
- interface SessionEngine
- {
- /*
- * 변수 설정
- * @param $arr array,array(변수 이름=>변수 값,...)
- */
- 공개 함수 setVariable($arr);
- /*
- * 세션 값 가져오기
- * @param $key string
- */
- public function get($key="");
- /*
- * 세션 값 설정
- * @param $key string
- * @param $value string
- */
- 공용 함수 set($key="",$value ="");
- /*
- * 세션 값 설정
- * @param $key string
- * @param $value string
- */
- 공용 함수 create($key="",$value ="");
- /*
- * 세션의 유효하지 않은 시간 업데이트
- * @param $key string
- */
- public functionrefresh($key="");
- /*
- * mysql 또는 memcache 연결을 닫습니다.
- */
- 공용 함수 close();
- /*
- * 만료된 세션 삭제
- */
- 공용 함수 cleanup();
- }
-
- SessionEngine을 구현하는 최종 클래스 mysqlSessionEngine{
- 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 이하를 사용하는 경우 대신 이 값을 memery 테이블에 삽입하세요.
- 비공개 $expire_time=1200;
- 비공개 $max_session_data_length = 2048;
- 비공개 $conn;
- 비공개 $mysql_version;
- 공개 함수 mysqlSessionEngine($arr=array(),$key="",&$_conn){
- $this->setVariable($arr);
- $this->id = $key;
- if(empty($this->id)||strlen($this->id)!=32){
- throw new Exception(__FILE__."->".__LINE__.": 세션의 쿠키 이름은 비워둘 수 없으며 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<5){
- $this->max_session_data_length = 255;
- }
- }
- 공용 함수 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';
- }
- }
- }
- }
- 공개 함수 get($key=""){
- if($key=="") $key = $this-> ID;
- $return = $this->getOne(''.$this->storage_name.'에서 값을 선택하세요. 여기서 id="'.$key.'"');
- if($return==$this->data_too_long_instead_value)
- {
- $return = $this->getOne(''.$this->storage_name_slow.'에서 값을 선택하세요. 여기서 id= "'.$key.'"');
- }
- if(!$return)
- {
- $mysqlError = mysql_error($this->conn);
- if(strpos($mysqlError,"존재하지 않습니다")!==false)
- {
- $this->initTable();
- }
- $return = 배열();
- }
- else
- {
- $return = unserialize($return);
- }
- return $return;
- }
- 공용 함수 close(){
- @mysql_close($this->conn);
- }
- 공용 함수 정리(){
- if($this->mysql_version>4){
- $sql = ''.$this->storage_name에서 삭제합니다.' 여기서 date_add(`time`,INTERVAL '.$this->expire_time.' SECOND) }else{
- $sql = ''.$this->storage_name_slow에서 삭제합니다.' 여기서 `time` '.$this->expire_time.' if($_SESSION['username']=="leinchu"){
- echo $sql;
- }
- $this->execute($sql);
- $sql = ''.$this->storage_name에서 삭제합니다.' 여기서 `time` '.$this->expire_time.' if($_SESSION['username']=="leinchu"){
- echo $sql;
- }
- }
- $this->execute($sql);
- }
- 공용 함수 새로 고침($key=""){
- if($this->mysql_version>4){
- $sql = '업데이트 '.$this->storage_name.' set `time`=CURRENT_TIMESTAMP() 여기서 id="'.$key.'"';
- }else{
- $sql = '업데이트 '.$this->storage_name.' set `time`=unix_timestamp() 여기서 id="'.$key.'"';
- }
- $return = $this->execute($sql);
- if(!$return){
- $this->initTable();
- $return = $this->execute($sql,true);
- }
- return $return;
- }
- 공개 함수 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'으로 바꿉니다. 값 설정=/''.$value.'/',id="'.$key.'",`time`=CURRENT_TIMESTAMP()';
- }else{
- $sql = ''.$this->storage_name으로 바꿉니다.' 값 설정=/''.$value.'/',id="'.$key.'",`time`=unix_timestamp()';
- }
- $return = $this->execute($sql);
- if(!$return){
- $this->initTable();
- $return = $this->execute($sql,true);
- }
- return $return;
- }
- 공개 함수 세트($key="",$value=""){
- if($key=="") $key = $this->id;
- if($value != "") $value = mysql_real_escape_string(serialize($value),$this->conn);
- $sql = ''.$this->storage_name 업데이트' 값 설정=/''.$value.'/' 여기서 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로 바꿉니다.' 값 설정=/''.$value.'/',id="'.$key.'",`time`=unix_timestamp()';
- $this->execute($sql,true);
- $sql = ''.$this->storage_name 업데이트' 값 설정=/''.$this->data_too_long_instead_value.'/' 여기서 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 `".$this->storage_name."_slow` (
- `id` char(32) NOT NULL 기본값 'ERR ',
- `value` 텍스트 NULL,
- `time` int(10) null이 아님 기본값 '0',
- PRIMARY KEY(`id`),
- KEY `time`(`time` )
- ) ENGINE=MyISAM
- ";
- $this->execute($sqlSlow,true);
-
- $sql = "
- 존재하지 않는 경우 CREATE TABLE `".$this->storage_name."` (
- `id` char(32) NOT NULL 기본값 'ERR',
- `value` VARCHAR(255) NULL,
- `time` int(10) null이 아님 기본값 '0',
- PRIMARY KEY(`id`),
- KEY `time`(`time`)
- ) 엔진=메모리
- ";
- }
- return $this->execute($sql,true);
- }
- 개인 함수 실행($sql,$die=false)
- {
- if($die)
- {
- mysql_query($sql,$this->conn) 또는 die(" exe SQL 오류:
".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를 반환합니다.
- }
- }
- 비공개 함수 쿼리($sql,$die=false){
- if($die)
- $rs = mysql_query($sql,$this->conn) 또는 die("query Sql error:
".mysql_error()." ".$sql." ");
- else
- $rs = mysql_query($sql,$this->conn);
- $rs를 반환합니다.
- }
- }
- $lnk = mysql_connect('localhost', 'root', '123456')
- 또는 die ('연결되지 않음: ' . mysql_error());
-
- // foo를 현재 db로 만듭니다
- mysql_select_db('test', $lnk) 또는 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['boom'])){
- $S->boom = $_GET['boom'];
- }
- echo "boom=".$S->boom."
";
- ?>
제제대码
|