zoukankan      html  css  js  c++  java
  • php session学习笔记(实例代码)

    http  无状态协议
    一个服务器向客户端发送消息的时候有三条信息
    一是状态二是头信息三是内容
    会话控制
    让一个用户访问每个页面,服务器都知道是哪个用户访问
    cookie
    cookie是通过头信息发送的
    setcookie函数之前不能有任何输出
    C:Documents and SettingsAdministratorCookies
    setcookie("name","value");//这样式保存不成功的 必须要设置时间
    setcookie("name[num1]",'11111111');
    setcookie("name[num2]",'22222222');
    setcookie("name[aa]",'aaaaaaaa');//setcookie("name['aa']",'aaaaaaaaaa');这两个是不同的
    session
    基于cookie,url   //url必须访问每个页面时都要带上sessionid
    服务器端配置
    session可以保存到数据库里面 保存到memcached里面 默认是文件保存
    启动
    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(),'',time()-3600,'/');第四个参数如果不指定的话是删除不了的
    }
    session_destroy();
    if(isset($_GET['sid'])){//如果$_GET['sid']为SESSIONID session_start就会直接把$_GET['SESSIONID']设为session_id(); 不需要这一步了
      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='http://www.a.com/a_setcookie.php?id=www.b.com'></script>";这个地方不会加上的
    一、介绍session信息写入到自定义的位置
       1.解决跨机保存session
          在linux下可以使用nfs或是sanba,共享文件夹得方式(window)
          
          使用数据库来实现(可以解决当前在线用户是多少)
          
          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() 好像自动调用了
       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中 (不受控制)
                session_start();
                
                php.ini
                session.save_handler = memcache
                
                session.save_path = "tcp://localhost:11211","tcp://192.168.1.128:11211"
  • 相关阅读:
    CF1051D Bicolorings dp
    loj2480 [CEOI2017]One-Way Streets 边双+树上差分
    有趣的支配树
    AtCoder Regular Contest 81
    [BZOJ5305][HAOI2018]苹果树(DP)
    [BZOJ4699]树上的最短路(最短路+线段树)
    [BZOJ3507][CQOI2014]通配符匹配(DP+Hash)
    [Luogu4724][模板]三维凸包(增量构造法)
    [BZOJ5317][JSOI2018]部落战争(闵可夫斯基和)
    [WC2014]时空穿梭(莫比乌斯反演)
  • 原文地址:https://www.cnblogs.com/linuxnotes/p/3470431.html
Copyright © 2011-2022 走看看