Col*_*mbo 2 php cookies session garbage-collection
我知道会话cookie可以被赋予一个生命周期(session.cookie_lifetime),并且在该生命周期之后,无论用户是否与该站点交互,cookie都将到期.
因此,我假设将其设置为0表示它们应该保持活动直到浏览器关闭.
我还认为我理解session.gc_maxlifetime可以为cookie设置垃圾收集生命周期(),只要用户在点击之间没有超过这个时间,那么cookie将保持活动状态.
为了测试这个,我一直试图让10秒的会话超时.
我试过了:
ini_set('session.gc_maxlifetime',10);
Run Code Online (Sandbox Code Playgroud)
但会话至少在1分钟后没有超时.
这是因为我只是对垃圾收集器说会话有10秒的生命但我实际上并没有触发垃圾收集器?
你如何设置垃圾收集器或者只是在每次请求会话时运行它?
首先,不要混淆cookie设置(客户端)和垃圾收集(服务器端).Cookie设置仅影响session_id的到期时间.即使浏览器已删除cookie,服务器上仍可能存在会话数据,相反,服务器可以在浏览器仍记住session_id时删除数据.
当您关闭浏览器或特定日期和时间时,cookie可以设置为过期(我相信默认选项是第一个,但我必须检查它).在这两种情况下,如果用户与站点进行交互,则cookie将保持有效,因为它在每个响应上都会更新.
启动垃圾收集时会删除会话数据,但您必须考虑到:
垃圾收集随机启动,由页面请求触发.
它会删除未在gc_maxlifetime秒内修改的会话数据.
默认情况下,会话数据存储在文件中,PHP不会跟踪哪个站点拥有哪些文件.这意味着将会话存储在默认共享位置会使您失去对会话到期的控制权:配置为在最短时间内保留会话数据的站点可能会从较长时间的其他站点中删除数据.
总而言之,如果您想要完全控制数据生命周期,则需要将会话数据存储在私有目录中,例如:
session_save_path('/home/foo/sessions');
ini_set('session.gc_maxlifetime', 3*60*60); // 3 hours
ini_set('session.use_only_cookies', TRUE);
session_start();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3441 次 |
| 最近记录: |