2010-09-24 156 views
9

session_start()是否应该通过session.gc_maxlifetime变量延长会话ID cookie的使用期限?PHP会话不会延长每个请求的Cookie过期

我的session.gc_maxlifetime是24分钟,每个会话只有24分钟的生活,无论网站上有额外的活动。我得到我的会话,刷新页面,到期时间不会改变。无论如何,这会导致登录24分钟后注销。我的配置有问题吗?

+0

我遇到了同样的问题,因为只要有活动,会话应该被延长,在做了很多本地测试之后,我发现只需添加session_regenerate_id()是我自己的最佳方式。 – 2013-03-26 00:29:45

回答

3

我觉得这个职位将提供您正在寻找的解决方案:垃圾收集器将运行Session timeouts in PHP: best practices

基本上,当session_start()叫,有1%的概率(默认)。当垃圾收集器运行时,它会扫描并删除过期的会话。但是,当您是唯一访问页面的用户(您可能在开发过程中)或用户很少时,垃圾收集器将只在您访问页面时运行。这发生在调用session_start()之后,有效地重置定时器。与其试图解决这个问题,只是实现你自己的session_start()函数来强制超时。试试@Glass Robot发布的功能,在我给你的链接上面。

+0

因此,PHP不会自动更新session_start()上的cookie?我必须手动做到这一点? – 2010-09-24 23:32:21

+0

它会更新到期计时器,但是当您访问另一个页面时会重置此计时器。尝试使用@Glass Robot张贴的功能(请参阅我的文章)。 – 2010-09-24 23:33:16

+0

在每个请求上重新生成会话ID是不是个好主意? – 2010-09-24 23:41:23

3

我已经注意到这种行为在PHP中,并尝试在PHP上的每个配置,但没有运气到目前为止。

我的课程从第一个session_start()的确切时间到临死去,在cookie一生中查找,它不是续订其到期时间。

我的应用程序已经有一个重要的客户端数量,每秒约60个连接,所以GC每隔1.5s就会被触发(我猜)。

我对cookie时间没有扩展的解决方案就像这样(它可能看起来不够高雅,但为我工作)。

function my_session_start($maxtime = 300){ 
    // $maxtime = 300 for 5 minutes 
    session_start(); 
    $_sess_name = session_name(); 
    $_sess_id = session_id(); 
    // Update cookie ;) 
    setcookie($_sess_name, $_sess_id, time() + $maxtime, "/"); 
} 

这是我特别的解决方案,因为问题是“会话ID cookie”。可能不是最佳的,但它的确适用于我!

+0

我刚刚尝试了这一点,我不得不将最后一行改为'setcookie($ _sess_name,$ _sess_id,time()+ $ maxtime,“/”);'以获取正确的cookie路径。如果没有第四个参数,每个文件夹都有自己的cookie,可能还有自己的会话。 (我没有玩它足够长的时间来清除所有的后果。) – user1618143 2013-07-11 14:18:45

+0

事实上,我已经打了你的评论问题,关于Cookie的路径,我会更新我的答案,谢谢! – 2013-07-15 17:50:51

5

我也有这个问题。我在想每个

session_set_cookie_params($sessionTime, '/', $domain); 
session_start(); 

会导致Cookie PHPSESSID的到期时间延长。但真正的Cookie PHPSESSID仅在会话中第一次生成新会话ID时由session_start()设置。

我的目标是每次打开页面时会重新生成会话过期时间。我想通了,会话可以有两个原因过期:

  1. 饼干PHPSESSID到期,其到期时间不受session_start()再生,是因为有到期时间的cookie的会话将始终到期。
  2. 用户的任何活动都不会导致该会话将在服务器端失效。它由ini_set('session.gc_maxlifetime', $sessionTime)设置。

解决方案在这种情况下是,当你将不设置过期时间的cookie,但session.gc_maxlifetime仍设置:

​​

最重要的是在session_set_cookie_params(0, '/', "." . $domain)0那么cookie将不会过期,有无需延长其到期时间。浏览器关闭时,该cookie将被删除。然后我们仅限于服务器端到期的时间。

我也遇到了问题,我无法通过jQuery Ajax PING扩展PHP会话时间,因为我已经为cookie中的PHPSESSID设置了到期时间。 0解决了会话未预期结束的所有问题。对不起我的英语不好。祝你好运。