设为首页 加入收藏

TOP

前端学PHP之会话Session(五)
2017-10-10 10:52:11 】 浏览:10231
Tags:前端 PHP 会话 Session
, $name) { return true; } //关闭 public static function close() { return true; } //读取 echo $_SESSION['username'] public static function read($sid) { $sql = "select * from session where sid = ?"; $stmt = self::$pdo -> prepare($sql); $stmt -> execute(array($sid)); $result = $stmt -> fetch(PDO::FETCH_ASSOC); //如果还没有会话信息,返回空字符串 if(!$result) { return ''; } //如果超出时间,销毁session if($result['utime'] + self::$maxlifetime < self::$ctime) { self::destroy($sid); return ''; } //如果用户换了ip或换了浏览器 if($result['uip'] != self::$uip || $result['uagent'] != self::$uagent) { self::destroy($sid); return ''; } return $result['sdata']; } //写入 $_SESSION['username'] = "meizi"; public static function write($sid, $data) { //通过sid获取已经有的数据 $sql = "select * from session where sid = ?"; $stmt = self::$pdo->prepare($sql); $stmt -> execute(array($sid)); $result = $stmt -> fetch(PDO::FETCH_ASSOC); //如果已经获取到了数据,就不插入而更新 if($result) { //如果数据和原来的不同才更新 if($result['sdata'] != $data || $result['utime']+10 < self::$ctime) { $sql = "update session set sdata = ?, utime = ? where sid=?"; $stmt = self::$pdo->prepare($sql); $stmt -> execute(array($data, self::$ctime, $sid)); } //如果没有数据,就新插入一条数据 } else { if(!empty($data)) { $sql = "insert into session(sid, sdata, utime, uip, uagent) values(?, ?, ?, ?, ?)"; $stmt = self::$pdo -> prepare($sql); $stmt -> execute(array($sid, $data, self::$ctime, self::$uip, self::$uagent)); } } } //销毁 session_destroy() public static function destroy($sid) { $sql = "delete from session where sid=?"; $stmt = self::$pdo->prepare($sql); return $stmt -> execute(array($sid)); } //回收垃圾 public static function gc($maxlifetime) { // utime < ctime - self::$maxlifetime $sql = "delete from session where utime < ?"; $stmt = self::$pdo->prepare($sql); return $stmt -> execute(array(self::$ctime - self::$maxlifetime)); } } //开启 DBSession::start($pdo);

 

memcached处理

  用数据库来同步Session会加大数据库的负担,因为数据库本来就是容易产生瓶颈的地方,但如果采用MemCache来处理Session是非常合适的,因为MemCache的缓存机制和Session非常相似。另外,MemCach可以做分布式,能够把Web服务器中的内存组合起来,成为一个”内存池”,不管是哪个服务器产生的Session,都可以放到这个“内存池”中,其他的Web服务器都可以使用。以这种方式来同步Session,不会加大数据库的负担,并且安全性也要比使用Cookie高。把session放到内存里面,读取也要比其他处理方式快很多

  自定义使用memcached处理session信息,和自定义数据库的处理方式相同,但要简单得多,因为MemCache的工作机制和Session技术很相似

<?php

class MemSession {
    public static $mem;             //pdo的对象
    public static $maxlifetime;     //最大的生存时间

    public static function start(Memcache $mem) {    
        self::$mem = $mem;    
        self::$maxlifetime = ini_get("session.gc_maxlifetime");
    
        //注册过程, 让PHP自己处理session时,按照这个函数指定的几个周期来完成
        session_set_save_handler(
            array(__CLASS__, "open"), 
            array(__CLASS__,"close"),
            array(__CLASS__, "read"), 
            array(__CLASS__, "write"),
            array(__CLASS__, "destroy"), 
            array(__CLASS__,"gc"));
        session_start();  //开启会话
    }

    // 开启时,session_start()
    public static function open($path, $name) {
        return true;
    }

    //关闭
    public static  function close() {
        return true;
    }

    //读取 echo $_SESSION['username'] 
    public static  function read($sid) {
        $data =
首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇前端学PHP之会话Session 下一篇PHP soap Web Service 使用SoapDi..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目