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生成静态页面详解
Dec 05 PHP
zend framework多模块多布局配置
Feb 26 PHP
PHP 之Section与Cookie使用总结
Sep 14 PHP
鸡肋的PHP单例模式应用详解
Jun 03 PHP
PHP的基本常识小结
Jul 05 PHP
php5.2 Json不能正确处理中文、GB编码的解决方法
Mar 28 PHP
PHP在网页中动态生成PDF文件详细教程
Jul 05 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
php恢复数组的key为数字序列的方法
Apr 28 PHP
Symfony核心类概述
Mar 17 PHP
PHP 计算两个特别大的整数实例代码
May 07 PHP
ThinkPHP3.1.2 使用cli命令行模式运行的方法
Apr 14 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上传图片、删除图片实现代码
2010/05/12 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
PHP处理JSON字符串key缺少双引号的解决方法
2014/09/16 PHP
Joomla语言翻译类Jtext用法分析
2016/05/05 PHP
Yii2针对游客、用户防范规则和限制的解决方法分析
2016/10/08 PHP
php获取指定数量随机字符串的方法
2017/02/06 PHP
你需要知道的10个最佳javascript开发实践小结
2012/04/15 Javascript
Extjs改变树节点的勾选状态点击按钮将复选框去掉
2013/11/14 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
jQuery实现圣诞节礼物动画案例解析
2016/12/25 Javascript
JS与HTML结合实现流程进度展示条思路详解
2017/09/03 Javascript
vue mint-ui学习笔记之picker的使用
2017/10/11 Javascript
vue实现2048小游戏功能思路详解
2018/05/09 Javascript
原生JS实现DOM加载完成马上执行JS代码的方法
2018/09/07 Javascript
详解小程序rich-text对富文本支持方案
2018/11/28 Javascript
详解vue中v-bind:style效果的自定义指令
2020/01/21 Javascript
js中switch语句的学习笔记
2020/03/25 Javascript
JavaScript ECMA-262-3 深入解析(二):变量对象实例详解
2020/04/25 Javascript
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Python中多线程thread与threading的实现方法
2014/08/18 Python
python使用MySQLdb访问mysql数据库的方法
2015/08/03 Python
Python 中 list 的各项操作技巧
2017/04/13 Python
Python pycharm 同时加载多个项目的方法
2019/01/17 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
python小程序之4名牌手洗牌发牌问题解析
2020/05/15 Python
Django-simple-captcha验证码包使用方法详解
2020/11/28 Python
Python解析微信dat文件的方法
2020/11/30 Python
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
写自荐信的七个技巧
2013/10/15 职场文书
岗位职责定义及内容
2013/11/08 职场文书
自我评价优秀范文分享
2013/11/30 职场文书
事务机电主管工作职责
2014/02/25 职场文书
4S店客服专员岗位职责
2015/04/07 职场文书
小学课改工作总结
2015/08/13 职场文书
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server