PHP使用Redis实现Session共享的实现示例


Posted in PHP onMay 12, 2019

前言

小型web服务, session数据基本是保存在本地(更多是本地磁盘文件), 但是当部署多台服务, 且需要共享session, 确保每个服务都能共享到同一份session数据.

redis 数据存储在内存中, 性能好, 配合持久化可确保数据完整.

设计方案

1. 通过php自身session配置实现

# 使用 redis 作为存储方案
session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"
# 若设置了连接密码, 则使用如下
session.save_path = "tcp://127.0.0.1:6379?auth=密码"

测试代码

<?php
ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379");

session_start();
echo "<pre>";
$_SESSION['usertest'.rand(1,5)]=1;
var_dump($_SESSION);

echo "</pre>";

输出 ↓

array(2) {
  ["usertest1"]=>
  int(88)
  ["usertest3"]=>
  int(1)
}
usertest1|i:1;usertest3|i:1;

评价

  • 优点: 实现简单, 无需修改php代码
  • 缺点: 配置不支持多样化, 只能应用于简单场景

2. 设置用户自定义会话存储函数

通过 session_set_save_handler() 函数设置用户自定义会话函数.

session_set_save_handler ( callable $open , callable $close , callable $read , callable $write , callable $destroy , callable $gc [, callable $create_sid [, callable $validate_sid [, callable $update_timestamp ]]] ) : bool
  
# >= php5.4
session_set_save_handler ( object $sessionhandler [, bool $register_shutdown = TRUE ] ) : bool

在配置完会话存储函数后, 再执行 session_start() 即可.

具体代码略, 以下提供一份 Memcached 的(来自Symfony框架代码):

<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\HttpFoundation\Session\Storage\Handler;

/**
 * MemcacheSessionHandler.
 *
 * @author Drak <drak@zikula.org>
 */
class MemcacheSessionHandler implements \SessionHandlerInterface
{
  /**
   * @var \Memcache Memcache driver.
   */
  private $memcache;

  /**
   * @var int Time to live in seconds
   */
  private $ttl;

  /**
   * @var string Key prefix for shared environments.
   */
  private $prefix;

  /**
   * Constructor.
   *
   * List of available options:
   * * prefix: The prefix to use for the memcache keys in order to avoid collision
   * * expiretime: The time to live in seconds
   *
   * @param \Memcache $memcache A \Memcache instance
   * @param array   $options An associative array of Memcache options
   *
   * @throws \InvalidArgumentException When unsupported options are passed
   */
  public function __construct(\Memcache $memcache, array $options = array())
  {
    if ($diff = array_diff(array_keys($options), array('prefix', 'expiretime'))) {
      throw new \InvalidArgumentException(sprintf(
        'The following options are not supported "%s"', implode(', ', $diff)
      ));
    }

    $this->memcache = $memcache;
    $this->ttl = isset($options['expiretime']) ? (int) $options['expiretime'] : 86400;
    $this->prefix = isset($options['prefix']) ? $options['prefix'] : 'sf2s';
  }

  /**
   * {@inheritdoc}
   */
  public function open($savePath, $sessionName)
  {
    return true;
  }

  /**
   * {@inheritdoc}
   */
  public function close()
  {
    return $this->memcache->close();
  }

  /**
   * {@inheritdoc}
   */
  public function read($sessionId)
  {
    return $this->memcache->get($this->prefix.$sessionId) ?: '';
  }

  /**
   * {@inheritdoc}
   */
  public function write($sessionId, $data)
  {
    return $this->memcache->set($this->prefix.$sessionId, $data, 0, time() + $this->ttl);
  }

  /**
   * {@inheritdoc}
   */
  public function destroy($sessionId)
  {
    return $this->memcache->delete($this->prefix.$sessionId);
  }

  /**
   * {@inheritdoc}
   */
  public function gc($maxlifetime)
  {
    // not required here because memcache will auto expire the records anyhow.
    return true;
  }

  /**
   * Return a Memcache instance
   *
   * @return \Memcache
   */
  protected function getMemcache()
  {
    return $this->memcache;
  }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
初级的用php写的采集程序
Mar 16 PHP
PHP生成带有雪花背景的验证码
Sep 28 PHP
PHP 基于文件头的文件类型验证类函数
May 01 PHP
纯PHP生成的一个树叶图片画图例子
Apr 16 PHP
PHP命名空间(namespace)的动态访问及使用技巧
Aug 18 PHP
PHP 读取和编写 XML
Nov 19 PHP
php基于openssl的rsa加密解密示例
Jul 11 PHP
PHP类型约束用法示例
Sep 28 PHP
php使用flock阻塞写入文件和非阻塞写入文件的实例讲解
Jul 10 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
Sep 16 PHP
tp框架(thinkPHP)实现三次登陆密码错误之后锁定账号功能示例
May 24 PHP
Laravel创建数据库表结构的例子
Oct 09 PHP
如何让PHP编码更加好看利于阅读
May 12 #PHP
Yii2处理密码加密及验证的方法
May 12 #PHP
php和asp语法上的区别总结
May 12 #PHP
Laravel推荐使用的十个辅助函数
May 10 #PHP
PHP下载大文件失败并限制下载速度的实例代码
May 10 #PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 #PHP
PHP文件类型检查及fileinfo模块安装使用详解
May 09 #PHP
You might like
PHP入门速成教程
2007/03/19 PHP
浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)
2013/06/29 PHP
ajax返回值中有回车换行、空格的解决方法分享
2013/10/24 PHP
PHP之header函数详解
2021/03/02 PHP
javascript判断用户浏览器插件安装情况的代码
2011/01/01 Javascript
Jquery获得控件值的三种方法总结
2014/02/13 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
JS或jQuery获取ASP.NET服务器控件ID的方法
2015/06/08 Javascript
JS实现的驼峰式和连字符式转换功能分析
2016/12/21 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
2017/02/15 Javascript
Node.js常用工具之util模块
2017/03/09 Javascript
详解NodeJS框架express的路径映射(路由)功能及控制
2017/03/24 NodeJs
vue 下列表侧滑操作实例代码详解
2018/07/24 Javascript
Vue.Draggable拖拽功能的配置使用方法
2020/07/29 Javascript
JS加载解析Markdown文档过程详解
2020/05/19 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
vue使用openlayers实现移动点动画
2020/09/24 Javascript
JavaScript 防盗链的原理以及破解方法
2020/12/29 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
Python实现的文本简单可逆加密算法示例
2017/05/18 Python
5个很好的Python面试题问题答案及分析
2018/01/19 Python
python 检查是否为中文字符串的方法
2018/12/28 Python
OpenCV 边缘检测
2019/07/10 Python
Python 转换文本编码实现解析
2019/08/27 Python
python实现静态web服务器
2019/09/03 Python
Tensorflow tf.tile()的用法实例分析
2020/05/22 Python
HTML中meta标签及Keywords
2020/04/15 HTML / CSS
美国Rue La La闪购网站:奢侈品、中高档品牌限时折扣
2016/10/19 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
物流专业大学生求职信范文
2013/10/28 职场文书
工作检讨书范文
2015/01/23 职场文书
会议欢迎词范文
2015/01/27 职场文书
考试作弊检讨
2015/01/27 职场文书
利用JavaScript写一个简单计算器
2021/11/27 Javascript
深入解析Apache Hudi内核文件标记机制
2022/03/31 Servers