Session保存到数据库的php类分享

复制代码 代码如下:

http  无状态合同

class SessionToDB
{
private $_path = null;
private $_name = null;
private $_pdo = null;
private $_ip = null;
private $_maxLifeTime = 0;

多少个服务器向客商端发送音讯的时候有三条音讯

public function __construct(PDO $pdo)
{
session_set_save_handler(
array(&$this, ‘open’),
array(&$this, ‘close’),
array(&$this, ‘read’),
array(&$this, ‘write’),
array(&$this, ‘destroy’),
array(&$this, ‘gc’)
);

一是气象二是头信息三是内容

$this->_pdo = $pdo;
$this->_ip = !empty($_SERVER[‘REMOTE_ADDR’]) ?
$_SERVER[‘REMOTE_ADDR’] : null;
$this->_maxLifeTime = ini_get(‘session.gc_maxlifetime’);
}

会话调整

public function open($path,$name)
{
return true;
}

让多个客商访谈每一个页面,服务器都晓得是哪些顾客访谈

public function close()
{
return true;
}

cookie

public function read($id)
{
$sql = ‘SELECT * FROM session where PHPSESSID = ?’;
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id));

cookie是因此头音讯发送的

if (!$result = $stmt->fetch(PDO::FETCH_ASSOC)) {
return null;
} elseif ($this->_ip != $result[‘client_ip’]) {
return null;
} elseif ($result[‘update_time’]+$this->_maxLifeTime <
time()){
$this->destroy($id);
return null;
} else {
return $result[‘data’];
}
}

setcookie函数从前无法有别的输出

public function write($id,$data)
{
$sql = ‘SELECT * FROM session where PHPSESSID = ?’;
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id));

C:Documents and SettingsAdministratorCookies

if ($result = $stmt->fetch(PDO::FETCH_ASSOC)) {
if ($result[‘data’] != $data) {
$sql = ‘UPDATE session SET update_time =? , date = ? WHERE PHPSESSID =
?’;

setcookie(“name”,”value”State of Qatar;//那样式保存不成功的 一定要设置时间

$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array(time(), $data, $id));
}
} else {
if (!empty($data)) {
$sql = ‘INSERT INTO session (PHPSESSID, update_time, client_ip, data)
VALUES (?,?,?,?)’;
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id, time(), $this->_ip, $data));
}
}

setcookie(“name[num1]”,’11111111′);

return true;
}

setcookie(“name[num2]”,’22222222′);

public function destroy($id)
{
$sql = ‘DELETE FROM session WHERE PHPSESSID = ?’;
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array($id));

setcookie(“name[aa]”,’aaaaaaaa’);//setcookie(“name[‘aa’]”,’aaaaaaaaaa’卡塔尔国;那多个是例外的

return true;
}

session

public function gc($maxLifeTime)
{
$sql = ‘DELETE FROM session WHERE update_time < ?’;
$stmt = $this->_pdo->prepare($sql);
$stmt->execute(array(time() – $maxLifeTime));

听大人说cookie,url   //url必得访谈每种页面时都要带上sessionid

return true;
}
}

服务器端配置

try{
$pdo = new PDO(‘mysql:host=localhost;dbname=rphp4zf’,
‘root’,’rickyfeng’);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

session能够保存到数据Curry面 保存到memcached里面 暗中认可是文本保留

new SessionToDB($pdo);
} catch(PDOException $e) {
echo ‘Error: ‘.$e->getMessage();
}

启动

session_start(卡塔尔国;//php的主导程序和session相关的的内建意况变量预先载入到内部存款和储蓄器中

多个效果与利益

1.敞开对话

2.再次回到已经存在的对话

纵然是基于cookie的session前边不可能有出口

这几天曾经毫无登记的方法写session了

php.ini

session.auto_start = 0 //设为1
各种脚本都并非每一次都要写session_start()了

类的定义必得在运转session早先加载

所以session.auto_start设为1 指标就无法保存到session中了

session_id();

session_name();

删除session

session_start();

//unset($_SESSION卡塔尔国;//不可能如此写 假使如此写的话脚本中就未有session数组了

//删除顾客端的在cookie中sessionid

isset($_COOKIE[session_name()]){

 
setcookie(session_name(State of Qatar,”,time(卡塔尔国-3600,’/’卡塔尔(قطر‎;第多个参数假使不点名的话是剔除不了的

}

session_destroy();

if(isset($_GET[‘sid’])){//如果$_GET[‘sid’]为SESSIONID
session_start就能够一直把$_GET[‘SESSIONID’]设为session_id(State of Qatar;
没有供给这一步了

  session_id($_GET[‘sid’]);

}

SID

基于cookie的SID为空 关闭cookie的 SID为SESSIONID=ab234bcfd435bcea

php.ini

session.use_trans_sid=1 //全数连接之处 form表单action header函数
不依附cookie的图景下增进SESSIONID=ab234bcfd435bcea

echo “<script
src=’

生龙活虎、介绍session音信写入到自定义之处

   1.化解跨机保存session

      在linux下能够动用nfs或是sanba,分享文件夹得办法(windowState of Qatar

      

      使用数据库来贯彻(能够缓慢解决当下在线顾客是不怎么卡塔尔国

      

      memcached来保存会话新闻(能够解决当下在线顾客是有些卡塔尔国

      session_set_save_handler()

     

      php.ini

      session.save_path = “D:Program FilesphpStudysession”

      session.name = PHPSESSID

        启用SID的支持

      session.use_trans_sid

      

      若是客商关闭浏览器 不点退出开关 session文件是不可以预知销毁的

      钦命过了多少秒今后数据就能被视为“垃圾” 并被解除

      session.gc_maxlifetime = 1440

          garbage collection  //垃圾回笼器

      这三个合起来就是运营gc进度处理

      session.gc_probability = 1

      session.gc_divisor     = 100

       

       初始化(session_start())

       概率

       session.gc_probability/session.gc_divisor 1/100

       那些值根据网址的登陆顾客来定

       任什么人运行session_start() 超过session.gc_maxlifetime秒的
所用的朽木粪土动会被免去

      

      session.use_cookies = 1

      session.cookie_lifetime = 0  //0表示关闭浏览器cookies到期
假如设为30秒的话 就算关闭浏览器cookie也是存在的
重新展开浏览器依然用的上二回的cookie

      session.cookie_path = /

      session.cookie_domain =

      session.save_handler = files
 用文件来保存会话音信

      session.save_handler = user  
借助于session_set_save_handler()函数

      session.save_handler = memcache 不用session_set_save_handler(卡塔尔(قطر‎ 直接绑定memcached

 session.save_path = tcp://localhost:11211

session.save_handler = memcache

session_set_save_handler函数的利用

首先

session.save_handler = user

function open($save_path,
$session_name)

{

  global $sess_save_path;

  $sess_save_path =
$save_path;

  return(true);

}

function close()

{ // www.jbxue.com

  return(true);

}

function read($id)

{

  global $sess_save_path;

  $sess_file = “$sess_save_path/sess_$id”;

  return (string) @file_get_contents($sess_file);

}

function write($id, $sess_data)

{

  global $sess_save_path;

  $sess_file = “$sess_save_path/sess_$id”;

  if ($fp = @fopen($sess_file, “w”)) {

    $return = fwrite($fp, $sess_data);

    fclose($fp);

    return $return;

  } else {

    return(false);

  }

}

function destroy($id)

{

  global $sess_save_path;

  $sess_file = “$sess_save_path/sess_$id”;

  return(@unlink($sess_file));

}

function gc($maxlifetime)

{

  global $sess_save_path;

  foreach (glob(“$sess_save_path/sess_*”) as $filename) {

    if (filemtime($filename) + $maxlifetime < time()) {

      @unlink($filename);

    }

  }

  return true;

}

session_set_save_handler(“open”, “close”, “read”, “write”, “destroy”,
“gc”);

session_start();

$_SESSION[‘admin’] = ‘admin’;

参考

/*

//运行session_start();启动

function open($save_path,$session_name){

  echo ‘open’;

  echo ‘<br />’;

  echo $save_path . ‘ – ‘ . $session_name;

  echo ‘<br />’;

}

//session_write_close() session_destroy()

function close(){

  echo ‘close’;

  echo ‘<br />’;

}

//session_start 读$_SESSION  读取session数据到$_SESSION中

function read($id){

  echo ‘read’;

  echo ‘<br />’;

  echo $id;

  echo ‘<br />’;

}

//甘休时和session_write_close(卡塔尔强逼提交session数据
 在session_start(卡塔尔国试行时也会实行write 若无设置值 $sess_data为空

function write($id,$sess_data){

  echo ‘write’;

  echo ‘<br />’;

  echo $id;

  echo ‘<br />’;

  echo $sess_data;

  echo ‘<br />’;

}

//session_destroy()

function destroy(){

  echo ‘destroy’;

  echo ‘<br />’;

}

//session.gc_probability和session.gc_divisor值决定 open read
session_start也会实行gc

function gc($maxlifetime){

  echo $maxlifetime;

  echo ‘gc’;

  echo ‘<br />’;

}

session_set_save_handler(‘open’,’close’,’read’,’write’,’destroy’,’gc’);

session_start();

$_SESSION[‘admin’] = ‘admin’;

//session_destroy();//session_destroy销毁之后 还有只怕会看见session数据

*/

将session音讯写入到数据库中

1.表设计

2.用类编排成功,写入数据库的表中session

3.参预到实例中

类中各回调函数定义都要定义为静态方法,属性也要是静态的()

<?php

error_reporting(1);

class Session{

   private static $handler;

   private static $lifetime;

   private static $time;

   private static $client_ip;

   

   private static function init($handler){

      self::$handler = $handler;

      self::$lifetime = ini_get(‘session.gc_maxlifetime’);

      self::$time = time();

      self::$client_ip = !empty($_SERVER[‘REMOTE_ADDR’]) ?
$_SERVER[‘REMOTE_ADDR’] : ‘unkown’;

   }

   public static function start(PDO $handler){

     self::init($handler);

     session_set_save_handler(

             array(__CLASS__,’open’),

             array(__CLASS__,’close’),

             array(__CLASS__,’read’),

             array(__CLASS__,’write’),

             array(__CLASS__,’destroy’),

             array(__CLASS__,’gc’)

     );

     session_start();

   }

   public static function open($path,$name){

     return true;

   }

   public static function close(){

     return true;

   }

   public static function read($phpsessid){

     $sql = “select phpsessid,update_time,client_ip,data from
xsphpdb.session where phpsessid=?”;

     $stmt = self::$handler->prepare($sql);

     $stmt->execute(array($phpsessid));

     if(!$result = $stmt->fetch(PDO::FETCH_ASSOC)){

       return ”;

     }

     if(self::$client_ip != $result[‘client_ip’]){

       self::destroy($phpsessid);

       return ”;

     }

     if(($result[‘update_time’]) + self::$lifetime < self::$time){

       self::destroy($phpsessid);

     }

     return $result[‘data’];

   }

   public static function write($phpsessid,$data){

     $sql = “select phpsessid,update_time,client_ip,data from
xsphpdb.session where phpsessid=?”;

     $stmt = self::$handler->prepare($sql);

     $stmt->execute(array($phpsessid));

     if($result=$stmt->fetch(PDO::FETCH_ASSOC)){

      if($result[‘data’] != $data || ($result[‘update_time’] + 30)
< self::$time){

        $sql = “update xsphpdb.session set update_time=?,data=? where
phpsessid=?”;

        $stmt = self::$handler->prepare($sql);

        $stmt->execute(array(self::$time,$data,$phpsessid));

      }     

     }else{

        if(!empty($data)){

          $sql = “insert into
xsphpdb.session(phpsessid,update_time,client_ip,data)
values(?,?,?,?)”;

          $stmt = self::$handler->prepare($sql);

          

          $res =
$stmt->execute(array($phpsessid,self::$time,self::$client_ip,$data));

          if(!$res){

            print_r($stmt->errorinfo());

          }

        }

     }

   }

   public static function destroy($phpsessid){

      $sql = “delete from xsphpdb.session where phpsessid = ?”;

      $stmt = self::$handler->prepare($sql);

      $stmt->execute(array($phpsessid));

      return true;

   }

   public static function gc($lifetime){

      $sql = ‘delete from xsphpdb.session where update_time<?’;

      $stmt = self::$handler->prepare($sql);

      $stmt->execute(array(self::$time-$lifetime));

   }

}

try{// www.jbxue.com

   $pdo = new PDO(‘mysql:host:localhost’,’root’,’root’);

}catch(PDOException $e){

  echo $e->getMessage();

}

Session::start($pdo);

$_SESSION[‘user’] = ‘lisi’;

session_destroy();

<?php

class MemSession{

   private static $handler=null;

   private static $lifetime=null;

   private static $time=null;

   const MS=’session_’;

   

   private static function init($handler){

     self::$handler=$handler;

     self::$lifetime=ini_get(‘session.gc_maxlifetime’);

     self::$time=time();

   }

   

   public static function start(Memcache
$memcache卡塔尔{//函数的的参数可以规定类型 int float 类名等

      self::init($memcache);

      

      session_set_save_handler(

             array(__CLASS__,’open’),

             array(__CLASS__,’close’),

             array(__CLASS__,’read’),

             array(__CLASS__,’write’),

             array(__CLASS__,’destroy’),

             array(__CLASS__,’gc’)

      );

      session_start();

   }

   

   public static function open($path,$name){

      return true;

   }

   public static function close(){

      return true;

   }

   public static function read($PHPSESSID){

      $out = self::$handler->get(self::session_key($PHPSESSID));

      

      if($out === false || $out == null){//注意$out为”时  $out ==
null为真

         return ”;

      }

      return $out;

   }

   //只要实行session_start(卡塔尔国 好像自动调用了

   public static function write($PHPSESSID,$data){

      $memthod = $data ? ‘set’ : ‘replace’;//replace key
对应的因素不设一时回来FALSE set会把空值也存进去

     
self::$handler->$memthod(self::session_key($PHPSESSID),$data,MEMCACHE_COMPRESSED,self::$lifetime);

   }

   public static function destroy($PHPSESSID){

      self::$handler->delete(self::session_key($PHPSESSID));

   }

   public static function gc($lifetime){

     return true;

   }

   

   private static function session_key($PHPSESSID){

      $session_key = self::MS.$PHPSESSID;

      

      return $session_key;

   }

}

$memcache = new Memcache;

$memcache->connect(‘localhost’,11211) or die(‘connect error’);

MemSession::start($memcache);

$_SESSION[‘admin2’] = ‘admin’;

$_SESSION[‘admin1’] = ‘admin’;

//注意: php.ini中session.cookie_lifetime =
0//表示用session生成的cookie //当浏览器关闭时 cookie失效

         memcache<?php

class MemSession{

   private static $handler=null;

   private static $lifetime=null;

   private static $time=null;

   const MS=’session_’;

   

   private static function init($handler){

     self::$handler=$handler;

     self::$lifetime=ini_get(‘session.gc_maxlifetime’);

     self::$time=time();

   }

   

   public static function start(Memcache $memcache){

      self::init($memcache);

      

      session_set_save_handler(

             array(__CLASS__,’open’),

             array(__CLASS__,’close’),

             array(__CLASS__,’read’),

             array(__CLASS__,’write’),

             array(__CLASS__,’destroy’),

             array(__CLASS__,’gc’)

      );

      session_start();

   }

   

   public static function open($path,$name){

      return true;

   }

   public static function close(){

      return true;

   }

   public static function read($PHPSESSID){

      $out = self::$handler->get(self::session_key($PHPSESSID));

      

      if($out === false || $out == null){//注意$out为”时  $out ==
null为真

         return ”;

      }

      return $out;

   }

   //只要施行session_start(State of Qatar 好像自动调用了

   public static function write($PHPSESSID,$data){

      $memthod = $data ? ‘set’ : ‘replace’;//replace key
对应的要素不设有的时候回来FALSE set会把空值也存进去

     
self::$handler->$memthod(self::session_key($PHPSESSID),$data,MEMCACHE_COMPRESSED,self::$lifetime);

   }

   public static function destroy($PHPSESSID){

      self::$handler->delete(self::session_key($PHPSESSID));

   }

   public static function gc($lifetime){

     return true;

   }

   

   private static function session_key($PHPSESSID){

      $session_key = self::MS.$PHPSESSID;

      

      return $session_key;

   }

}

$memcache = new Memcache;

$memcache->connect(‘localhost’,11211) or die(‘connect error’);

MemSession::start($memcache);

$_SESSION[‘admin2’] = ‘admin’;

$_SESSION[‘admin1’] = ‘admin’;

//注意: php.ini中session.cookie_lifetime =
0//表示用session生成的cookie //当浏览器关闭时 cookie失效

         memcache中的数据 缓存时间到了的话
标题会缓存少年老成段时间(数据现已被消弭了)

          

          php中session过期时间设置 

           
尽管”最终的改良时间”到”将来”超越了gc_maxlifetime(暗中认可是1440)秒,那些session文件就被以为是逾期了,在下叁遍session回笼的时候,假设那个文件依然未有被转移过,这几个session文件就能够被剔除(session就超时了)。

            

            寻觅memcached中的全体数据

            stats items

            stats cachedump 3 0  //3为stats items中查出来的号码

            

            

            第二种方式 把数据写道memcached中 (不受调整State of Qatar

            session_start();

            

            php.ini

            session.save_handler = memcache

            

            session.save_path =
“tcp://localhost:11211″,”tcp://192.168.1.128:11211”

发表评论

电子邮件地址不会被公开。 必填项已用*标注