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 相关文章推荐
用文本文件实现的动态实时发布新闻的程序
Oct 09 PHP
PHP 出现乱码和Sessions验证问题的解决方法!
Dec 06 PHP
PHP系统命令函数使用分析
Jul 05 PHP
php计算当前程序执行时间示例
Apr 24 PHP
ThinkPHP的URL重写问题
Jun 22 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
Yii入门教程之Yii安装及hello world
Nov 25 PHP
php中数字、字符与对象判断函数用法实例
Nov 26 PHP
详解WordPress中创建和添加过滤器的相关PHP函数
Dec 29 PHP
Win7环境下Apache连接MySQL提示连接已重置的解决办法
May 09 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP实现财务审核通过后返现金额到客户的功能
Jul 04 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 应用程序安全防范技术研究
2009/09/25 PHP
网站用php实现paypal整合方法
2010/11/28 PHP
一些php技巧与注意事项分析
2011/02/03 PHP
PHP使用PDO抽象层获取查询结果的方法示例
2018/05/10 PHP
我的javascript 函数链之演变
2011/04/07 Javascript
JavaScript中的console.profile()函数详细介绍
2014/12/29 Javascript
cocos2dx骨骼动画Armature源码剖析(三)
2015/09/08 Javascript
jquery实现全选功能效果的实现代码
2016/05/05 Javascript
让浏览器崩溃的12行JS代码(DoS攻击分析及防御)
2016/10/10 Javascript
浅谈AngularJs指令之scope属性详解
2016/10/24 Javascript
vue中用动态组件实现选项卡切换效果
2017/03/25 Javascript
slideToggle+slideup实现手机端折叠菜单效果
2017/05/25 Javascript
VsCode插件整理(小结)
2017/09/14 Javascript
webpack4 入门最简单的例子介绍
2018/09/05 Javascript
ES6基础之默认参数值
2019/02/21 Javascript
让你30分钟快速掌握vue3教程
2020/10/26 Javascript
用python + hadoop streaming 分布式编程(一) -- 原理介绍,样例程序与本地调试
2014/07/14 Python
python邮件发送smtplib使用详解
2020/06/16 Python
python实现爬山算法的思路详解
2019/04/09 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
tensorflow之变量初始化(tf.Variable)使用详解
2020/02/06 Python
python GUI库图形界面开发之PyQt5选项卡控件QTabWidget详细使用方法与实例
2020/03/01 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
keras的三种模型实现与区别说明
2020/07/03 Python
Html5页面在微信端的分享的实现方法
2018/08/30 HTML / CSS
Bonami斯洛伐克:购买家具和家居饰品
2019/07/02 全球购物
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
测试工程师职业规划书
2014/02/06 职场文书
委托代理人授权委托书范本
2014/09/24 职场文书
乡镇党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
新闻报道稿范文
2015/07/23 职场文书
《老人与海鸥》教学反思
2016/02/16 职场文书
python pyhs2 的安装操作
2021/04/07 Python
解析CSS 提取图片主题色功能(小技巧)
2021/05/12 HTML / CSS
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers