对于大访问量的站点使用默认的Session 并不合适,我们可以将其存入数据库、或者使用Redis KEY-VALUE数据存储方案
首先新建一个session表

  1. CREATE TABLE `sessions` (
  2. `sid` char(40) NOT NULL,
  3. `updatetime` int(20) NOT NULL,
  4. `data` varchar(200) NOT NULL,
  5. UNIQUE KEY `sid` (`sid`) USING HASH
  6. ) ENGINE=MEMORY DEFAULT CHARSET=utf8;

Mysql 的memory引擎采用内存表,所有数据存储在内存,操作速度快

  1. <?php
  2. //引入数据库文件
  3. include "db.php";
  4. class MySessionHandler implements SessionHandlerInterface
  5. {
  6. private $savePath;
  7. private $sessData;
  8. public $expiretime; //设置过期时间
  9. public $db; //数据库
  10. public function __construct($hanlder =''){
  11.  
  12. $this->db = Database::getInstance();
  13.  
  14. //获取数据库实力
  15. ///var_dump($this->db);
  16.  
  17. }
  18.  
  19. public function open($savePath, $sessionName)
  20. {
  21.  
  22. return true;
  23. }
  24.  
  25. public function close()
  26. {
  27. return true;
  28. }
  29.  
  30. public function read($id)
  31. {
  32. $sql ="select * from sessions where sid ='$id'";
  33. $result = $this->db->execute($sql);
  34. if(!empty($result)){
  35. return $this->sessData = $result;
  36. }
  37. }
  38. //函数的参数 $id -> 当前会话ID
  39. //数据DATA -> 序列化之后的字符串
  40. public function write($id, $data)
  41. {
  42. // echo $id;
  43. // echo $data;
  44. $now = time();
  45. $newExp = $now+$this->expiretime; //总时间=当前时间 + 期限时间
  46. $sql = "select * from sessions where sid ='$id'";
  47. $result = $this->db->getOne($sql);
  48. //var_dump($result);
  49. if($data==''||isset($data)){
  50. $data = $this->sessData;
  51. }
  52. if($result){
  53. //如果存在则更新
  54. $sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
  55. //echo $sql;
  56. $update_data =$this->db->execute($sql);
  57. if($update_data){
  58. return true;
  59. }
  60.  
  61. }else{
  62. //不存在则生成生成
  63. $sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')";
  64. $insert_data = $this->db->execute($sql);
  65. if($insert_data){
  66. return true;
  67. }
  68. }
  69. return false;
  70. }
  71.  
  72. public function destroy($id)
  73. { //销毁
  74. $sql = "delete from sessions where sid="."$id";
  75. $destory = $this->db->execute($sql);
  76. if($destory){
  77. return true;
  78. }else{
  79. return false;
  80. }
  81. }
  82.  
  83. public function gc($sessMaxLifeTime)
  84. {
  85. $t = time();
  86. $sql ="delete from sessions where $t - 'updatetime'>${sessMaxLifeTime}";
  87. $data = $this->db->execute($this->tosql);
  88. if($data){
  89. return true;
  90. }else{
  91. return false;
  92. }
  93. return true;
  94. }
  95. }
实例化
此处 PHP 手册可以有两种方法
    1,实现了SessionHandlerInterface借口的对象,自PHP5.4可以使用
    2 ,直接使用  session_set_save_handler

  1. //判断PHP版本
  2. if(version_compare(PHP_VERSION,5.4)==1){
  3.  
  4. session_set_save_handler($handler, true);
  5. session_start();
  6. }else{
  7. ini_set('session.use_trans_sid',0);
  8. ini_set('session.use_cookies',1);
  9. ini_set('session.cookie_path','/');
  10. ini_set('session.save_handler','user');
  11. session_module_name('user');
  12. session_set_save_handler(array($session,"open"),array($session,"close"),array($session,"read"),array($session,"write"),array($session,"destory"),array($session,"gc"));
  13. session_start();
  14. }
  15. $_SESSION['QQ']="QQ";
  16. echo $_SESSION['QQ'];

数据库代码 db.php

  1. <?php
  2. class Database{
  3. static $instance;
  4. static $db;
  5. static function getInstance(){
  6. if(self::$instance){
  7. return self::$instance;
  8. }else{
  9. return new Database();
  10. }
  11. }
  12. public function __construct(){
  13. self::$db = new PDO('mysql:host=localhost;dbname=session', 'root','');
  14. }
  15.  
  16. public function getOne($sql){
  17. $rs =self::$db->query($sql);
  18. @$rs->setFetchMode(PDO::FETCH_ASSOC);//返回关联数组
  19. $result = $rs -> fetch();
  20. return $result;
  21. }
  22. public function execute($sql){
  23.  
  24. $rs = self::$db->exec($sql);
  25. return $rs;
  26.  
  27. }
  28.  
  29. }
  30.  
  31. //$data = Database::getInstance();
  32. //var_dump($data);

使用REDIS 存储SESSION

  1. <?php
  2. class SessionManager{
  3. private $redis;
  4. private $sessionSavePath;
  5. private $sessionName;
  6. private $sessionExpireTime = 30;
  7. public function __construct(){
  8. $this->redis = new Redis();
  9. $this->redis->connect('127.0.0.1',6379); //连接redis
  10. $retval = session_set_save_handler(
  11. array($this,"open"),
  12. array($this,"close"),
  13. array($this,"read"),
  14. array($this,"write"),
  15. array($this,"destory"),
  16. array($this,"gc")
  17. );
  18. session_start();
  19. }
  20.  
  21. public function open($path,$name){
  22. return true;
  23. }
  24. public function close(){
  25. return true;
  26. }
  27. public function read($id){
  28. $value = $this->redis->get($id);
  29. if($value){
  30. return $value;
  31. }else{
  32. return "";
  33. }
  34. }
  35. public function write($id,$data){
  36. if($this->redis->set($id,$data)){
  37. $this->redis->expire($id,$this->sessionExpireTime);
  38. //设置过期时间
  39. return true;
  40. }
  41. return false;
  42. }
  43. public function destory($id){
  44. if($this->redis->delete($id)){
  45. return true;
  46. }
  47. return false;
  48. }
  49. public function gc($maxlifetime){
  50. return true;
  51. }
  52. //析构函数
  53. public function __destruct(){
  54. session_write_close();
  55. }
  56.  
  57. }
  58.  
  59. $re = new SessionManager();
  60. $_SESSION['name'] = "qq";
  61. echo $_SESSION['name'];

PHP 实现Session入库/存入redis的更多相关文章

  1. session存入redis

    Session信息入Redis Session简介 session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一 ...

  2. 将php中session存入redis中

    PHP 的会话默认是以文件的形式存在的,可以配置到 Redis 中,即提高了访问速度,又能很好地实现会话共享! 配置方式如下: 方法一:修改 php.ini 的设置 session.save_hand ...

  3. session 存入redis 或 memcache 的方法

      Session简介 session,中文经常翻译为会话,其本来的含义是 指有始有终的一系列动作/消息,比如打电话时从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session.有时候我们 ...

  4. 将Session放入Redis

    默认情况下,我们的PHP是以文件的形式保存Session数据,所以,每次读写会话信息,就需要去访问硬盘. 为了解决会话信息夸域名问题,即为了实现同一时刻只能一个地方登录,同时也解决读写会话信息必须访问 ...

  5. php SESSION入库的实现

    session入库,就是重写session制机,在session的周期内,获得到session的数据并记录到数据库 Session默认是存放到服务器上的文件中,不方便管理,如果能把session存放到 ...

  6. shiro-redis实现session存储到redis

    shiro-redis开源项目已经很好的将shiro与redis整合到一起,实现了将session存入redis,可以方便的用于session共享实现集群部署. git地址:https://githu ...

  7. session高级(session入库)

    我们知道,session是一种会话技术,用来实现跨脚本共享数据. 在之前的php会话技术中我们介绍过,session是存放在服务器端的文件里的,因此session有可能因为文件数量过多,会在查询ses ...

  8. php实现session入库

    为什么要把session存入数据库?有什么用? 可以:统计在线人数,现实多站点session共享(通行证),控制同个账号登入人数等. 要实现session的入库,有关键的几个基本知识: session ...

  9. openfire源码解读之将cache和session对象移入redis以提升性能

    原文:http://blog.csdn.net/jinzhencs/article/details/50522322 前言: 目前我们的openfire服务器只能支撑单机2W 集群4W.(估测在线用户 ...

随机推荐

  1. 用html5(requestFullscreen) js实现点击一个按钮使浏览器全屏效果

    项目中需要将后台浏览器的窗口全屏,也就是我们点击一个按钮要实现按F11全屏的效果. 在HTML5中,W3C制定了关于全屏的API,就可以实现全屏幕的效果,也可以让页面中的图片,视频等全屏目前只有goo ...

  2. layui动态渲染生成select的option值

    脚本语言:设定默认值:直接拼接,然后根据返回值渲染select// 动态渲染脚本类型下拉框 // 1.发送ajax请求得到data // 2.将data渲染到页面上 function getDataL ...

  3. 查看zookeeper是否启动

    查看进程: 方法: ps -aux | grep 'zookeeper' 系统有返回,说明zookeeper启动. 你可以搜索ps -aux.

  4. html+css+JavaScript贪吃蛇

    写文记录一下最近新完成的贪吃蛇游戏案例,用到了html.css和JavaScript,难度不高,适合刚入坑的同学练习,欢迎大家交流. 下面贴源码: <!DOCTYPE html> < ...

  5. go的sync.Map

    sync.Map这个数据结构是线程安全的(基本类型Map结构体在并发读写时会panic严重错误),它填补了Map线程不安全的缺陷,不过最好只在需要的情况下使用.它一般用于并发模型中对同一类map结构体 ...

  6. JavaScript 函数和事件

    上面例子中的 JavaScript 语句,会在页面加载时执行. 通常,我们需要在某个事件发生时执行代码,比如当用户点击按钮时. 如果我们把 JavaScript 代码放入函数中,就可以在事件发生时调用 ...

  7. solr-in-action-ch4-Configuring Solr

    Solr基本的三个XML配置文件: solr.xml: solr 日志.shard.solrcould等配置 solrconfig.xml: 某个solr core的配置 schema.xml:某个s ...

  8. python 自动化之路 day 20 Django进阶/BBS项目【一】

    一.django进阶 1.django orm 增删改查 1.1.创建表: 1 2 3 >>> from blog.models import Blog >>> b ...

  9. php 佛祖保佑 永无bug

    <pre name="code" class="java">/* _ooOoo_ o8888888o 88" . "88 (| ...

  10. python3----splitlines

    Python中的splitlines用来分割行.当传入的参数为True时,表示保留换行符 \n.通过下面的例子就很明白了: mulLine = """Hello!!! W ...