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的优点与缺点
Apr 11 PHP
php模板原理讲解
Nov 13 PHP
php获取表单中多个同名input元素的值
Mar 20 PHP
php实现json编码的方法
Jul 30 PHP
thinkPHP下ueditor的使用方法详解
Dec 26 PHP
php while循环控制的简单实例
May 30 PHP
php实现基于openssl的加密解密方法
Sep 30 PHP
php版微信支付api.mch.weixin.qq.com域名解析慢原因与解决方法
Oct 12 PHP
php获取文件名称和扩展名的方法
Feb 07 PHP
php封装的mongodb操作类代码
Aug 06 PHP
PhpStorm 如何优雅的调试Hyperf的方法步骤
Nov 24 PHP
PHP设计模式之外观模式(Facade)入门与应用详解
Dec 13 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
新浪新闻小偷
2006/10/09 PHP
分页栏的web标准实现
2011/11/01 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
简介JavaScript中Math.cos()余弦方法的使用
2015/06/15 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
Node.js中npm常用命令大全
2016/06/09 Javascript
Angularjs 自定义服务的三种方式(推荐)
2016/08/02 Javascript
angularjs中回车键触发某一事件的方法
2017/04/24 Javascript
基于angular实现三级联动的生日插件
2017/05/12 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
element-ui使用导航栏跳转路由的用法详解
2018/08/22 Javascript
vue实现双向绑定和依赖收集遇到的坑
2018/11/29 Javascript
Vue项目安装插件并保存
2019/01/28 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
vue使用keep-alive实现组件切换时保存原组件数据方法
2020/10/30 Javascript
编写Python脚本来实现最简单的FTP下载的教程
2015/05/04 Python
Python 闭包的使用方法
2017/09/07 Python
windows下安装python的C扩展编译环境(解决Unable to find vcvarsall.bat)
2018/02/21 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
24式加速你的Python(小结)
2019/06/13 Python
python 使用事件对象asyncio.Event来同步协程的操作
2020/05/04 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
JAKO-O德国野酷台湾站:德国首屈一指的婴幼童用品品牌
2019/01/14 全球购物
Nayomi官网:沙特阿拉伯王国睡衣和内衣品牌
2020/12/19 全球购物
项目资料员岗位职责
2013/12/10 职场文书
运动会入场解说词300字
2014/01/25 职场文书
公司副总经理任命书
2014/06/05 职场文书
会计学毕业生求职信
2014/06/25 职场文书
教书育人演讲稿
2014/09/11 职场文书
商务考察邀请函模板
2015/02/02 职场文书
2015年党员岗位承诺书
2015/04/27 职场文书
新农村建设指导员工作总结
2015/08/13 职场文书
处世之道:关于真诚相待的名言推荐
2019/12/02 职场文书
如何用JS实现简单的数据监听
2021/05/06 Javascript
开发微信小程序之WXSS样式教程
2022/04/18 HTML / CSS