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边学边教》(01.开篇――准备工作)
Dec 13 PHP
php中session_unset与session_destroy的区别分析
Jun 16 PHP
PHP中fwrite与file_put_contents性能测试代码
Aug 02 PHP
PHP多线程类及用法实例
Dec 03 PHP
linux下为php添加iconv模块的方法
Feb 28 PHP
Laravel5中防止XSS跨站攻击的方法
Oct 10 PHP
php实现的二分查找算法示例
Jun 20 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 PHP
PHP面向对象五大原则之单一职责原则(SRP)详解
Apr 04 PHP
php curl优化下载微信头像的方法总结
Sep 07 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 PHP
php redis setnx分布式锁简单原理解析
Oct 23 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
一个ubbcode的函数,速度很快.
2006/10/09 PHP
解析yii数据库的增删查改
2013/06/20 PHP
jQuery 阴影插件代码分享
2012/01/09 Javascript
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
你必须知道的Javascript知识点之&quot;this指针&quot;的应用
2013/04/23 Javascript
jQuery中before()方法用法实例
2014/12/25 Javascript
详解javascript函数的参数
2015/11/10 Javascript
深入浅析JavaScript系列(13):This? Yes,this!
2016/01/05 Javascript
动态设置form表单的action属性的值的简单方法
2016/05/25 Javascript
使用BootStrap实现用户登录界面UI
2016/08/10 Javascript
bing Map 在vue项目中的使用详解
2018/04/09 Javascript
vue的传参方式汇总和router使用技巧
2018/05/22 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
layer.open的自适应及居中及子页面标题的修改方法
2019/09/05 Javascript
小程序调用微信支付的方法
2019/09/26 Javascript
JS使用正则表达式判断输入框失去焦点事件
2019/10/16 Javascript
vue实现全屏滚动效果(非fullpage.js)
2020/03/07 Javascript
Python脚本实现格式化css文件
2015/04/08 Python
Python的Django框架中的URL配置与松耦合
2015/07/15 Python
Python中死锁的形成示例及死锁情况的防止
2016/06/14 Python
Python MySQLdb 使用utf-8 编码插入中文数据问题
2018/03/13 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
如何爬取通过ajax加载数据的网站
2019/08/15 Python
python获取Linux发行版名称
2019/08/30 Python
详解Django admin高级用法
2019/11/06 Python
手动安装python3.6的操作过程详解
2020/01/13 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
2020/02/24 Python
使用HTML5里的classList操作CSS类
2016/06/28 HTML / CSS
详解html5页面 rem 布局适配方法
2018/01/12 HTML / CSS
英国鞋类及配饰零售商:Kurt Geiger
2017/02/04 全球购物
德国在线购买葡萄酒网站:Geile Weine
2019/09/24 全球购物
英国家居用品和床上用品零售商:P&B Home
2020/01/16 全球购物
Myprotein比利时官方网站:欧洲第一运动营养品牌
2020/10/04 全球购物
大学生通用个人的自我评价
2014/02/10 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
中学推普周活动总结
2015/05/07 职场文书