【发布时间】:2011-12-17 18:20:40
【问题描述】:
我有一个关于 php 会话的快速问题。如果我希望会话持续一个月(或直到用户明确注销),我将更改以下 php.ini 设置:session.gc_maxlifetime = 2592000 和 session.cookie_lifetime = 2592000,分别从默认值 1440 和 0 更改。对吗?
谢谢。
【问题讨论】:
标签: session authentication cookies php
我有一个关于 php 会话的快速问题。如果我希望会话持续一个月(或直到用户明确注销),我将更改以下 php.ini 设置:session.gc_maxlifetime = 2592000 和 session.cookie_lifetime = 2592000,分别从默认值 1440 和 0 更改。对吗?
谢谢。
【问题讨论】:
标签: session authentication cookies php
session.cookie_lifetime of 0 将保留 cookie 直到浏览器重新启动(基本上是整个会话)。
将您的session.gc_maxlifetime 设置为如此高的值意味着您的服务器上将有许多过时的会话,如果您有大量会话,这可能是一个问题 - 通常会话存储在系统的 /tmp 文件夹中。当这个文件夹(通常在 *nix 机器上)被填满时,它可能会导致机器出现问题 - 进程开始锁定,因为它们无论出于何种原因无法创建临时文件。 (您可以将 session.save_path 更改为 /tmp 以外的其他名称,这样您就不会遇到此问题 - 尤其是在共享主机上)。
不过,在服务器配置方面有更多经验的人可能知道还有其他超时,例如 Apache 和 TCP 设置,无论您创建多高的值都可能超过此值。
我相信您基本上要求的是Remember Me 功能,该功能将允许某人登录而无需记住他们的用户名/密码并记住确切的状态(1 个月的会话)。
Remember Me 功能可以使用轮换身份验证 cookie 来实现,该 cookie 根据用户的登录凭据设置为已知系列中的下一个令牌。
1 个月的会话功能可以通过将会话的状态存储在持久缓存(文件缓存、数据库,像 Toyko Tyrant 之类的更精细的东西)中来实现。
【讨论】:
如果您要求的是“记住我”,最简单的解决方案是:
一旦用户成功登录,您将创建一个随机哈希并将其存储在 cookie(在用户浏览器上)和数据库中(加入用户 ID)
因此,当用户首先调用您的脚本时,您会检查哈希值,如果哈希值存在于数据库中,您会自动登录而无需询问用户名/密码,否则您将询问用户名/密码
在第一个选项中,您“绕过”登录,因为哈希标识了用户。 如果用户从您的站点明确注销,只需删除会话并重置用户哈希(在数据库端)...
使用此方法您还可以设置时间限制,在 cookie 中只需设置 cookie 持续时间,在 db 端添加时间限制,如果用户使用超过时间限制的哈希登录,则不允许身份验证登录 :)
希望这能解决您的问题
【讨论】: