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"
  • 相关阅读:
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 画图(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 相邻数对(暴力)
    Java实现 蓝桥杯 算法训练 Cowboys
    Java实现 蓝桥杯 算法训练 Cowboys
    55. Jump Game
    54. Spiral Matrix
    50. Pow(x, n)
  • 原文地址:https://www.cnblogs.com/linuxnotes/p/3470431.html
Copyright © 2011-2022 走看看