colinmollenhour/php-redis-session-abstract

基于Redis的会话处理器,具有乐观锁定

v2.0.0 2024-05-15 18:54 UTC

README

基于Redis的会话处理器,具有乐观锁定。

特性

  • 当会话数据大小超过压缩阈值时,会话数据将被压缩。
  • 支持的压缩库有 'gzip', 'lzf', 'lz4', 和 'snappy'。
    • Gzip是最慢的,但提供最好的压缩率。
    • Lzf可以通过PECL轻松安装。
    • Lz4由HHVM支持。
  • 可以在不丢失会话数据的情况下动态启用、禁用或重新配置压缩。
  • 过期由Redis处理;无需垃圾回收。
  • 记录由于没有或丢失锁而没有写入会话的情况。
  • 限制并发锁定请求的数量。
  • 检测不活跃的等待进程以防止并发节流中的假阳性。
  • 检测崩溃的进程以防止会话死锁(仅限Linux)。
  • 为爬虫和机器人提供较短的会话生命周期,以减少资源浪费。
  • 可以完全禁用锁定

锁定算法属性

  • 只有一个进程可以获取会话的写锁。
  • 如果另一个进程破坏了锁,进程可能会丢失它,在这种情况下,会话将不会写入。
  • 锁定可能在 BREAK_AFTER 秒后损坏,并且获取锁的进程是不确定的。
  • 只有 MAX_CONCURRENCY 个进程可以等待同一个会话的锁,否则将抛出 ConcurrentConnectionsExceededException

压缩

会话数据压缩效果很好,因此使用压缩是提高容量而无需为Redis分配大量RAM并减少网络利用率的绝佳方式。默认的 压缩阈值 是2048字节,因此任何等于或大于此大小的会话数据都将使用默认的 压缩库(gzip)进行压缩。可以通过将 compression_lib 设置为 none 来禁用压缩。然而,lzfsnappy 提供了与压缩率相当的速度更快的压缩,因此如果您有root权限,我强烈建议使用这些之一。lzf可以通过pecl轻松安装。

sudo pecl install lzf

注意: 如果使用suhosin并且启用了会话数据加密(默认为suhosin.session.encrypt=on),则有以下两点

  1. 您可能会得到非常差的压缩率。
  2. 在我的经验中,lzf无法压缩加密数据。不知道为什么...

如果任何压缩库无法压缩会话数据,将在system.log中记录错误,并且会话将不压缩保存。如果您启用了suhosin.session.encrypt=on,我建议您禁用它(除非您在共享主机上,因为Magento已经进行了自己的会话验证)或禁用压缩或至少不要在加密启用的情况下使用lzf。

机器人检测

爬虫和爬虫通常不使用cookie,这意味着您可能正在存储数以千计的没有用途的会话。更糟糕的是,攻击者可以使用您的有限会话存储来攻击您,通过淹没您的后端,从而使您的合法会话被驱逐。但是,您不希望错误地将用户识别为机器人并无意中终止他们的会话。此模块使用正则表达式以及会话写入次数的计数来确定会话生命周期。

Cm_Cache_Backend_Redis一起使用

在Cm_RedisSession和Cm_Cache_Backend_Redis一起使用时应该没有问题。然而,强烈建议即使它们运行在同一个服务器上,也应该运行两个独立的Redis实例。实际上,运行两个实例会有更好的性能,因为Redis是单线程的,所以在多核服务器上受限于单个核心的性能。此外,为缓存和会话分配不同数量的内存,并实施不同的“maxmemory”策略也是有意义的。如果您绝对必须为两者运行一个Redis实例,那么请不要使用相同的'db'编号。但再次强调,最好运行两个Redis实例。

许可证

@copyright  Copyright (c) 2013 Colin Mollenhour (http://colin.mollenhour.com)
This project is licensed under the "New BSD" license (see source).