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面向对象全攻略 (九)访问类型
Sep 30 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
php下使用iconv需要注意的问题
Nov 20 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
php将mysql数据库整库导出生成sql文件的具体实现
Jan 08 PHP
PHP连接MSSQL方法汇总
Feb 05 PHP
PHP简单数据库操作类实例【支持增删改查及链式操作】
Oct 10 PHP
php中__toString()方法用法示例
Dec 07 PHP
PHP实现二维数组去重功能示例
Jan 12 PHP
PHP使用mysqli操作MySQL数据库的简单方法
Feb 04 PHP
Thinkphp5.0自动生成模块及目录的方法详解
Apr 17 PHP
Smarty模板配置实例简析
Jul 20 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 CURL模拟GET及POST函数代码
2010/04/25 PHP
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
PHP会话处理的10个函数
2015/08/11 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
jquery.ui.draggable中文文档
2009/11/24 Javascript
JavaScript接口实现代码 (Interfaces In JavaScript)
2010/06/11 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
Javascript变量作用域详解
2013/12/06 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
2016/05/10 Javascript
JS组件系列之MVVM组件 vue 30分钟搞定前端增删改查
2017/04/28 Javascript
vue.js实现条件渲染的实例代码
2017/06/22 Javascript
基于ES6 Array.of的用法(实例讲解)
2017/09/05 Javascript
浅谈Webpack下多环境配置的思路
2018/06/27 Javascript
Windows下支持自动更新的Electron应用脚手架的方法
2018/12/24 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
vue商城中商品“筛选器”功能的实现代码
2020/07/01 Javascript
vue仿携程轮播图效果(滑动轮播,下方高度自适应)
2021/02/11 Vue.js
Python生成随机数的方法
2014/01/14 Python
两个使用Python脚本操作文件的小示例分享
2015/08/27 Python
python基础教程项目四之新闻聚合
2018/04/02 Python
DataFrame:通过SparkSql将scala类转为DataFrame的方法
2019/01/29 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
Python下划线5种含义代码实例解析
2020/07/10 Python
Python 操作 MySQL数据库
2020/09/18 Python
python实现逻辑回归的示例
2020/10/09 Python
安德玛比利时官网:Under Armour比利时
2019/08/28 全球购物
马歇尔耳机官网:Marshall Headphones
2020/02/04 全球购物
哪些情况下不应该使用索引
2015/07/20 面试题
Linux开机引导的步骤是什么
2014/02/26 面试题
医院护士专业个人的求职信
2013/12/09 职场文书
学生党员思想汇报
2013/12/28 职场文书
销售业务员岗位职责
2014/01/29 职场文书
高校自主招生校长推荐信
2015/03/23 职场文书
海上钢琴师观后感
2015/06/03 职场文书