配置会话和保存处理程序
编辑本页警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 2.8,现已不再维护。
读本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。
配置会话和保存处理程序
本文讨论如何配置会话管理,并根据您的特定需求对其进行微调。本文档涵盖欧宝官网下载app了存储和检索会话数据的保存处理程序,以及配置会话行为。
保存处理程序
PHP会话工作流有6个可能发生的操作。接下来是正常会话开放
,读
,写
而且关闭
的可能性摧毁
而且gc
(垃圾收集,将过期任何旧会话:gc
根据PHP的配置随机调用,如果被调用,它将在开放
操作)。你可以在php.net/session.customhandler
原生PHP保存处理程序
所谓的原生处理程序,是编译成PHP或由PHP扩展(如PHP- sqlite, PHP- memcached等)提供的保存处理程序。
所有本地保存处理程序都是PHP内部的,因此没有面向公共的API。它们必须由php . ini
指令,通常session.save_path
以及潜在的其他驱动程序特定指令。的文档块中可以找到具体的细节setoption ()
每个类的方法。例如,Memcached扩展提供的扩展可以在php.net/memcached.setoption
而本地保存处理程序可以通过直接使用激活报错(“会话。save_handler’,美元的名字);
, ob娱乐下载Symfony提供了一种方便的方式来激活这些,其方式与自定义处理程序相同。
ob娱乐下载Symfony提供了以下本地保存处理程序的驱动程序作为示例:
使用示例:
1 2 3 4 5 6
使用ob娱乐下载\组件\HttpFoundation\会话\会话;使用ob娱乐下载\组件\HttpFoundation\会话\存储\NativeSessionStorage;使用ob娱乐下载\组件\HttpFoundation\会话\存储\处理程序\NativeFileSessionHandler;$sessionStorage=新NativeSessionStorage (数组(),新NativeFileSessionHandler ());$会话=新会话($sessionStorage);
请注意
除了文件
处理器是内置在PHP中并且总是可用的,其他处理器的可用性取决于这些PHP扩展在运行时是活动的。
请注意
本地保存处理程序提供了会话存储的快速解决方案,然而,在需要更多控制的复杂系统中,自定义保存处理程序可能提供更多的自由和灵活性。ob娱乐下载Symfony提供了几个实现,您可以根据需要进一步定制这些实现。
自定义保存处理程序
自定义处理程序是那些通过提供6个回调函数完全取代PHP内置会话保存处理程序的处理程序,PHP会在会话工作流的不同位置内部调用这些回调函数。
Symfob娱乐下载ony HttpFoundation组件默认提供了一些,如果你想自己编写的话,这些可以很容易地作为示例。
- PdoSessionHandler
- MemcacheSessionHandler
- MemcachedSessionHandler
- MongoDbSessionHandler
- NullSessionHandler
使用示例:
1 2 3 4 5 6 7
使用ob娱乐下载\组件\HttpFoundation\会话\会话;使用ob娱乐下载\组件\HttpFoundation\会话\存储\NativeSessionStorage;使用ob娱乐下载\组件\HttpFoundation\会话\存储\处理程序\PdoSessionHandler;$pdo=新\ PDO(…);$sessionStorage=新NativeSessionStorage (数组(),新PdoSessionHandler ($pdo));$会话=新会话($sessionStorage);
配置PHP会话
的NativeSessionStorage能配置大部分吗php . ini
文档中的配置指令php.net/session.configuration.
要配置这些设置,请传递密钥(省略首字母会话。
的键的一部分)作为键值数组选择美元
构造函数参数。或者通过setoption ()方法。
为了清晰起见,本文档解释了一些关键选项。欧宝官网下载app
会话Cookie生存期
出于安全考虑,会话令牌一般建议以会话cookie的形式发送。属性指定会话cookie的生存期(以秒为单位),从而配置会话cookie的生存期cookie_lifetime
输入构造函数选择美元
论点NativeSessionStorage.
设置一个cookie_lifetime
来0
将使cookie只在浏览器保持打开状态时存在。一般来说,cookie_lifetime
将被设置为一个相对较大的天数、周数或月数。根据应用程序的不同,将cookie设置为一年或更长时间并不罕见。
由于会话cookie只是一个客户端令牌,它们在控制安全设置的细节方面不那么重要,最终只能从服务器端安全地控制安全设置。
请注意
的cookie_lifetime
setting是cookie应该存在的秒数,它不是Unix时间戳。产生的会话cookie将被标记为过期时间时间()
+cookie_lifetime
从服务器获取时间的地方。
配置垃圾收集
会话打开时,PHP将调用gc
处理程序随机根据概率设置由session.gc_probability
/session.gc_divisor
.例如,如果这些设置为5/100
分别意味着5%的概率。同样的,3/4
也就是说有四分之三的几率被召唤,也就是75%
如果调用了垃圾收集处理程序,PHP将传递存储在php . ini
指令session.gc_maxlifetime
.在此上下文中,其含义是任何存储的会话被保存超过gc_maxlifetime
Ago应该被删除。这允许基于空闲时间过期记录。
然而,一些操作系统(例如Debian)执行自己的会话处理并设置session.gc_probability
变量来0
停止PHP进行垃圾收集。这就是Symfony现ob娱乐下载在将这个值重写为的原因1
.
如果您希望使用您的php . ini
,增加如下配置:
1 2 3 4
# config.yml框架:会话:gc_probability:零
您可以通过传递来配置这些设置gc_probability
,gc_divisor
而且gc_maxlifetime
的构造函数NativeSessionStorage或者setoption ()方法。
会话的生命周期
当创建一个新会话时,意味着Symfony向客户端发出一个新的会话cookie,ob娱乐下载该cookie将被标记为过期时间。这是通过在中添加PHP运行时配置值来计算的session.cookie_lifetime
使用当前服务器时间。
请注意
PHP只会发出一次cookie。客户端需要在整个生命周期内存储该cookie。新的cookie只会在会话被销毁、浏览器cookie被删除或会话ID使用迁移()
或无效()
方法会话
类。
cookie的初始生存期可以通过配置来设置NativeSessionStorage
使用setOptions(array('cookie_lifetime' => 1234))
方法。
请注意
饼干的一生0
表示浏览器关闭时cookie过期。
会话空闲时间/保持活跃
通常情况下,您可能希望在用户登录时离开其终端时,通过在一段空闲时间后销毁会话来保护或减少对会话的未经授权的使用。例如,银行应用程序通常会在用户不活动5到10分钟后将其注销。在这里设置cookie生存期是不合适的,因为这可以由客户端操作,因此我们必须在服务器端执行过期操作。最简单的方法是通过合理频繁运行的垃圾收集来实现这一点。的cookie_lifetime
会不会设置一个比较高的值,而垃圾回收呢gc_maxlifetime
将被设置为在所需的空闲时间内销毁会话。
另一个选项是在会话启动后检查会话是否已经过期。可以根据需要销毁会话。这种处理方法可以允许将会话过期集成到用户体验中,例如,通过显示消息。
ob娱乐下载Symfony记录了关于每个会话的一些基本元数据,让您在这方面完全自由。
会话缓存限制
为了避免用户看到过时的数据,通常会将启用会话的资源与禁用缓存的头一起发送。为此,PHP Sessions具有sessions.cache_limiter
选项,该选项决定会话启动时将随响应发送哪些头(如果有)。
在建设,NativeSessionStorage将此全局选项设置为""
(不发送头),以防开发人员希望使用响应对象来管理响应标头。
谨慎
如果您依赖于PHP会话来管理HTTP缓存,那么您必须手动设置cache_limiter
选项NativeSessionStorage到非空值。
例如,你可以在构造过程中将它设置为PHP的默认值:
使用示例:
1 2 3 4
使用ob娱乐下载\组件\HttpFoundation\会话\存储\NativeSessionStorage;$选项[“cache_limiter”] = session_cache_limititer ();$sessionStorage=新NativeSessionStorage ($选项);
会话的元数据
会话使用一些基本元数据进行装饰,以支持对安全设置的良好控制。会话对象有一个元数据的getter,getMetadataBag ()的实例MetadataBag:
1 2
$会话->getMetadataBag ()->getCreated ();$会话->getMetadataBag ()->getLastUsed ();
这两个方法都返回一个Unix时间戳(相对于服务器)。
这个元数据可以用来显式地在访问时终止会话,例如:
1 2 3 4 5
$会话->开始();如果(()——的时候了$会话->getMetadataBag ()->getLastUsed () >$maxIdleTime) {$会话->无效();扔新SessionExpired ();//重定向到过期会话页面}
它也可以告诉什么cookie_lifetime
为特定cookie设置getLifetime ()
方法:
1
$会话->getMetadataBag ()->getLifetime ();
cookie的过期时间可以通过添加创建的时间戳和生命周期来确定。
PHP 5.4兼容性
从PHP 5.4.0开始,SessionHandler而且SessionHandlerInterface是可用的。ob娱乐下载的向前兼容性SessionHandlerInterface所以它可以在PHP 5.3下使用。这大大提高了与其他库的互操作性。
SessionHandler是一个特殊的PHP内部类,它向PHP用户空间公开本机保存处理程序。
为了为使用PHP 5.4的用户提供解决方案,Symfony有一个特殊的类ob娱乐下载NativeSessionHandler在PHP 5.4下,从\ SessionHandler
在PHP 5.3中只是一个空基类。这为利用PHP 5.4功能(如果可用的话)提供了一些有趣的机会。
保存处理程序代理
保存处理程序代理基本上是保存处理程序的包装,该保存处理程序的引入是为了无缝地支持从PHP 5.3到PHP 5.4+的迁移。它进一步创建了一个扩展点,可以在其中添加自定义逻辑,该逻辑独立于内部包装的处理程序。
继承的保存处理程序类代理有两种AbstractProxy:它们是NativeProxy而且SessionHandlerProxy.
NativeSessionStorage自动将存储处理程序注入保存处理程序代理中,除非已经由保存处理程序代理包装。
NativeProxy在PHP 5.3下,当内部PHP保存处理程序使用本机* SessionHandler
类,而SessionHandlerProxy将用于包装任何自定义保存处理程序,该实现SessionHandlerInterface.
从PHP 5.4及以上版本开始,实现了所有会话处理程序SessionHandlerInterface包括本机* SessionHandler
继承自SessionHandler.
代理机制允许您更深入地参与会话保存处理程序类。例如,可以使用代理加密任何会话事务,而不需要知道特定的保存处理程序。
请注意
在PHP 5.4之前,您只能代理用户空间保存处理程序,而不能代理本地PHP保存处理程序。