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 相关文章推荐
oracle资料库函式库
Oct 09 PHP
php输入流php://input使用浅析
Sep 02 PHP
PDO防注入原理分析以及使用PDO的注意事项总结
Oct 23 PHP
PHP中怎样防止SQL注入分析
Oct 23 PHP
phplot生成图片类用法详解
Jan 06 PHP
PHP中的Session对象如何使用
Sep 25 PHP
php实现压缩合并js的方法【附demo源码下载】
Sep 22 PHP
php中遍历二维数组并以表格的形式输出的方法
Jan 03 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
Laravel框架模型的创建及模型对数据操作示例
May 07 PHP
PHP 7.4 新语法之箭头函数实例详解
May 09 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
Feb 29 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
雄兵连:天使彦天使彦为爱折翼,彦和炙心同时念动的誓言!
2020/03/02 国漫
PHP操作mysql函数详解,mysql和php交互函数
2011/05/19 PHP
php导出word格式数据的代码实例
2013/11/25 PHP
thinkPHP模型初始化实例分析
2015/12/03 PHP
PHP后台实现微信小程序登录
2018/08/03 PHP
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
Javascript计算时间差的函数分享
2011/07/04 Javascript
代码触发js事件(click、change)示例应用
2013/12/13 Javascript
node.js中的fs.readSync方法使用说明
2014/12/17 Javascript
javascript实现自动填写表单实例简析
2015/12/02 Javascript
WordPress中利用AJAX异步获取评论用户头像的方法
2016/01/08 Javascript
用原生JS对AJAX做简单封装的实例代码
2016/07/13 Javascript
Jquery EasyUI Datagrid右键菜单实现方法
2016/12/30 Javascript
React-router 4 按需加载的实现方式及原理详解
2017/05/25 Javascript
webpack构建vue项目的详细教程(配置篇)
2017/07/17 Javascript
React Native中TabBarIOS的简单使用方法示例
2017/10/13 Javascript
javascript实现文件拖拽事件
2018/03/29 Javascript
Vue实现导出excel表格功能
2018/03/30 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
vue中英文切换实例代码
2020/01/21 Javascript
js实现日历
2020/11/07 Javascript
[01:00:59]VP VS VG Supermajor小组赛胜者组第二轮 BO3第二场 6.2
2018/06/03 DOTA
[07:01]DOTA2-DPC中国联赛正赛 Aster vs Magma 3月5日 赛后选手采访
2021/03/11 DOTA
Windows 8.1 64bit下搭建 Scrapy 0.22 环境
2018/11/18 Python
在notepad++中实现直接运行python代码
2019/12/18 Python
Css3圆角边框制作代码
2015/11/18 HTML / CSS
CSS3 Calc实现滚动条出现页面不跳动问题
2017/09/14 HTML / CSS
阿联酋彩妆品牌:OUD MILANO
2019/10/06 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
五十岁生日宴会答谢词
2014/01/15 职场文书
读书活动总结范文
2014/04/26 职场文书
项目建议书模板
2014/05/12 职场文书
教师四风自我剖析材料
2014/09/30 职场文书
交通肇事罪辩护词
2015/05/21 职场文书
2016企业先进集体事迹材料
2016/02/25 职场文书
python 常用的异步框架汇总整理
2021/06/18 Python