mage2pro / php-redis-session-abstract
基于Redis的会话处理器,具有乐观锁功能
Requires
- php: ~5.5.0|~5.6.0|~7.0.0|~7.1.0|~7.2.0
- colinmollenhour/credis: ~1.6
README
基于Redis的会话处理器,具有乐观锁功能。
特性
- 当会话数据大小超过压缩阈值时,会话数据将被压缩。
- 支持的压缩库有 'gzip', 'lzf', 'lz4', 和 'snappy'。
- Gzip是最慢的,但提供最佳的压缩比。
- Lzf可以通过PECL轻松安装。
- Lz4由HHVM支持。
- 可以在不丢失会话数据的情况下动态启用、禁用或重新配置压缩。
- 过期由Redis处理;无需垃圾收集。
- 记录会话未写入时的日志(由于未获得或丢失锁)。
- 限制并发锁请求的数量。
- 检测空闲等待进程以防止并发节流中的假阳性。
- 检测崩溃的进程以防止会话死锁(仅限Linux)。
- 为爬虫和机器人提供较短的会话生命周期以减少资源浪费。
- 可以完全禁用锁定
锁定算法属性
- 只能有一个进程可以在会话上获得写锁。
- 如果另一个进程将其破坏,进程可能会丢失其锁,在这种情况下,会话将不会被写入。
- 锁可能在
BREAK_AFTER
秒后被破坏,并且获取锁的进程是不确定的。 - 只有
MAX_CONCURRENCY
个进程可以等待同一个会话的锁,否则将抛出ConcurrentConnectionsExceededException
。
压缩
会话数据压缩效果非常好,因此使用压缩是一种在不分配大量Redis RAM的情况下增加容量并减少网络利用率的绝佳方式。默认的 compression threshold
是 2048 字节,因此等于或大于此大小的任何会话数据都将使用默认的 compression_lib
(gzip)进行压缩。可以通过将 compression_lib
设置为 none
来禁用压缩。然而,lzf
和 snappy
都提供了与压缩比相当的速度较快的压缩,所以我强烈建议如果您有root权限,使用其中之一。lzf可以通过pecl轻松安装。
sudo pecl install lzf
注意:如果您使用suhosin并启用了会话数据加密(默认为 suhosin.session.encrypt=on
),则有两件事
- 您可能会得到非常差的压缩比。
- 在我的经验中,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).