http  无状态协议
一个服务器向客户端发送消息的时候有三条信息
一是状态二是头信息三是内容
会话控制
让一个用户访问每个页面,服务器都知道是哪个用户访问
cookie
cookie是通过头信息发送的
setcookie函数之前不能有任何输出
C:\Documents and Settings\Administrator\Cookies
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 Files\phpStudy\session"
      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"

php session学习笔记(实例代码)的更多相关文章

  1. iOS: 学习笔记, 用代码驱动自动布局实例(swift)

    iOS自动布局是设置iOS界面的利器.本实例展示了如何使用自动布局语言设置水平布局, 垂直布局1. 创建空白iOS项目(swift)2. 添加一个控制器类, 修改YYAppDelegate.swift ...

  2. iOS: 学习笔记, 用代码驱动自动布局实例

    iOS自动布局是设置iOS界面的利器. 本实例展示了如何使用自动布局语言设置水平布局, 垂直布局 1. 创建空白iOS项目 2. 添加一个控制器类, 修改YYAppDelegate.m文件 #impo ...

  3. iOS: 学习笔记实例, 用代码控制视图创建与切换

    1. 创建iOS, Single View Application.2. 修改YYViewController.m // // YYViewController.m // DynamicViewDem ...

  4. 18、cookies与session学习笔记

    本文记录学习 cookies 和 session 的一些小练习和知识点   知识点1    cookies 和 session 的由来   HTTP协议是无状态的协议,因为一旦浏览器和服务器之间的请求 ...

  5. 转--Android学习笔记-实用代码合集

    http://blog.csdn.net/yf210yf/article/details/7295577 转载请注明原文出处:奔跑的蜗牛(袁方的技术博客)点击打开链接 一.当利用textview显示内 ...

  6. JavaWeb学习笔记--Servlet代码集

    目录: 登录系统提交表单数据打开PDFCookieURL传递参数URL重写跟踪会话使用HttpSession对象跟踪会话Servlet间协作过滤器Filter 登录系统 <!DOCTYPE HT ...

  7. webpack学习笔记--压缩代码

    浏览器从服务器访问网页时获取的 JavaScript.CSS 资源都是文本形式的,文件越大网页加载时间越长. 为了提升网页加速速度和减少网络传输流量,可以对这些资源进行压缩. 压缩的方法除了可以通过 ...

  8. Vue2学习笔记:实例

    1.实例 <!DOCTYPE html> <html> <head> <title></title> <script src=&quo ...

  9. [学习笔记] SSD代码笔记 + EifficientNet backbone 练习

    SSD代码笔记 + EifficientNet backbone 练习 ssd代码完全ok了,然后用最近性能和速度都非常牛的Eifficient Net做backbone设计了自己的TinySSD网络 ...

随机推荐

  1. mysql中 case when的使用

    SELECT a.hsid, a.house_code, a.sale_date, a.pjid, COUNT( sdid ) AS num, b.hsid, b.pscid, b.hscode, b ...

  2. poj3080解题报告(暴力、最大公共子串)

    POJ 3080,题目链接http://poj.org/problem?id=3080 题意: 就是求m个长度为60的字符串的最长连续公共子串,2<=m<=10 规定: 1.最长公共串长度 ...

  3. jQuery之父:每天都写点代码

    去年秋天,我的“兼职编程项目”遇到了一些问题:要不是从 Khan Academy 的项目里挪出时间来的话,我根本没办法将不理想的进度弥补上. 这些项目遇到了一些严重的问题.之前的工作我主要是在周末,有 ...

  4. Recovery启动流程(2)---UI界面

    转载请注明来源:cuixiaolei的技术博客 Recovery启动流程系列文章把recvoery目录下文件分成小块讲解,最后再以一条主线贯穿所有的内容.这篇文章主要讲解Recovery-UI的相关内 ...

  5. javaweb学习总结二十二(servlet开发中常见的问题汇总)

    一:web应用的映射问题 通常我们从别人那里拷贝来的代码,自己会修改应用的名称,但是web映射的访问路径并没有修改,还是原来的映射. 解决方法: 工程右键--properties--myeclipse ...

  6. javascript-函数进阶

    一.函数定义 1.函数声明 function add(i,j){ return i+j; } 特点:1.函数声明定义函数会被前置.要知道在js代码执行时,会有一个预解析,预解析时会把变量声明.函数声明 ...

  7. Ajax返回xml类型数据

    ajax可以返回文本类型数据和xml类型数据,xml是计算机通用语言 可以使用js解析返回xml类型数据的dom对象 前端页面 <!doctype html> <html lang= ...

  8. GD库使用小结---2

    接着上一篇.GD库可以折腾很多用法出来,当然得跟画图相关,除了前面的验证码.水印外,还可以进行图片的缩放,裁剪.旋转等操作,这在很多应用中可以见到. 1. 加水印 前面已经知道,我们可以使用image ...

  9. 【AngularJs】---表单验证

    1. 必填项 验证某个表单输入是否已填写,只要在输入字段元素上添加HTML5标记required即可: <input type="text" required /> 2 ...

  10. Unity3D 之暂停和继续的实现

    Time.timeScale 时间缩放 当timeScale传递时间1.0时和实时时间一样快.当timeScale传递时间0.5时比实时时间慢一半. 当timeScale传递时间为0时游戏基本上暂停了 ...