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程序实现支持页面后退的两种方法
Jun 30 PHP
php 删除无限级目录与文件代码共享
Nov 22 PHP
PHP 组件化编程技巧
Jun 06 PHP
php+memcache实现的网站在线人数统计代码
Jul 04 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
Jul 05 PHP
PHP简单选择排序算法实例
Jan 26 PHP
php使用GD库创建图片缩略图的方法
Jun 10 PHP
教你php如何实现验证码
Jan 20 PHP
PHP入门教程之会话控制技巧(cookie与session)
Sep 11 PHP
深入理解PHP类的自动载入机制
Sep 16 PHP
用PHP去掉文件头的Unicode签名(BOM)方法
Jun 22 PHP
php修改word的实例方法
Nov 17 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
用PHP动态生成虚拟现实VRML网页
2006/10/09 PHP
PHP下通过file_get_contents的代理使用方法
2011/02/16 PHP
php模拟服务器实现autoindex效果的方法
2015/03/10 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
JavaScript通过事件代理高亮显示表格行的方法
2015/05/27 Javascript
jquery实现不包含当前项的选择器实例
2015/06/25 Javascript
简单介绍jsonp 使用小结
2016/01/27 Javascript
jQuery实现的分页功能示例
2017/01/22 Javascript
整理关于Bootstrap排版的慕课笔记
2017/03/29 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
使用weixin-java-miniapp配置进行单个小程序的配置详解
2019/03/29 Javascript
基于vue实现滚动条滚动到指定位置对应位置数字进行tween特效
2019/04/18 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
js实现点赞按钮功能的实例代码
2020/03/06 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
2020/04/09 Javascript
CentOS中升级Python版本的方法详解
2017/07/10 Python
python寻找list中最大值、最小值并返回其所在位置的方法
2018/06/27 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
Python Learning 列表的更多操作及示例代码
2018/08/22 Python
python3实现爬取淘宝美食代码分享
2018/09/23 Python
Python/ArcPy遍历指定目录中的MDB文件方法
2018/10/27 Python
实时获取Python的print输出流方法
2019/01/07 Python
PyTorch笔记之scatter()函数的使用
2020/02/12 Python
基于Python爬取搜狐证券股票过程解析
2020/11/18 Python
蔻驰美国官网:COACH美国
2016/08/18 全球购物
小学生防溺水广播稿
2014/01/12 职场文书
迟到检讨书300字
2014/02/14 职场文书
公司开业庆典策划方案
2014/06/04 职场文书
超市理货员岗位职责
2014/07/04 职场文书
道路运输企业安全生产责任书
2014/07/28 职场文书
《全神贯注》教学反思
2016/02/22 职场文书
Pytorch 使用tensor特定条件判断索引
2021/04/08 Python
SpringBoot实现异步事件驱动的方法
2021/06/28 Java/Android
光之国的四大叛徒:第一贝利亚导致宇宙毁灭,赛文奥特曼在榜
2022/03/18 日漫