【问题标题】:Properly using session_set_cookie_params正确使用 session_set_cookie_params
【发布时间】:2010-12-31 13:13:24
【问题描述】:

我正在尝试实现一个具有“记住我”功能的登录系统。这是我的登录页面:http://pastebin.com/q6iK0Mgy。在此,我尝试使用 session_set_cookie_params() 来延长会话 cookie(PHPSESSIONID) 的到期时间。但它不起作用。

代码中的相关部分:在此内部 if() 循环正在执行,但 session_set_cookie_params('3600') 没有效果。我正在调用 session_name() ,因为它应该是 session_set_cookie_params() 的要求(根据 php 手册中的 cmets 之一)

if ( isset($_POST["submit"]) ) 
 {
     session_name() ;
     echo "calling before checked " ;
     if ( $_POST["remember"] == "on") 
    {
       // extend expiration date of cookie
       session_set_cookie_params('3600');
       echo "<br/>calling after sessions_set_cookie_params" ;
    }
 } 
 require_once("includes/session.php"); //session start ?>

我希望我能够解释我想要做什么。基本上我想做的是延长 session_cookie 的过期时间。我的做法完全错误吗?还有其他方法可以达到同样的效果吗?

谢谢

【问题讨论】:

  • 为什么不使用 set_cookie('name','value',3600)?
  • 我相信我需要使用会话来实现登录系统,因此需要扩展会话cookie。我错了吗?
  • 您是否只在您的开发计算机上测试过这个?因为一个真正的问题是在'localhost'上设置会话cookie不起作用,我认为是由于HTTP协议的一些安全属性。例如,请参阅此示例blog.perplexedlabs.com/2008/12/21/php-sessions-on-localhost,如果域不是本地主机,则将域设置为“.yourdomain”。如果它是 localhost,则域设置为 ''(空字符串),然后它就可以工作了。我不知道这是否是您问题的解决方案,但如果您在 localhost 上进行测试,它是值得测试的。
  • @Johan Awesome :-) 您应该添加评论的扩展作为答案。干杯。
  • 也许吧。我只需要再理解一遍! ;) 那是一年多前我写的,我有点忘记这是怎么回事了。

标签: php


【解决方案1】:

来自文档:

你需要打电话 session_set_cookie_params() 为每个 请求和 之前 session_start() 是 调用。

同时检查http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime

【讨论】:

  • 我正在调用 session_start 。它在includes/session.php
  • 尝试在 session_start() 之前调用 session_set_cookie_params()
【解决方案2】:

答案永远不会太老,对吧?

所以,PHP 是 愚蠢的。就像,它没有做你认为有意义的事情。

session_set_cookie_param 在您调用 session_start 的那一刻之前不会做任何事情。因此,如果您在调用会话开始后设置 cookie 参数,则为时已晚。如果您设置了 cookie 参数但随后不调用 session_start,则不会发生任何事情。

session_start 也是一个有趣的野兽。它只在第一次调用时读取 cookie 数据——好吧,除非……你强制它写入,或者没有 cookie 开始。因此,如果没有 cookie,它会写入 cookie 数据,客户端会保存您的会话。耶!但是当cookie已经存在时,我们如何强制它写入,从而更新我们新的到期日期??

因此,如果客户端上已经存在 cookie,我们会忽略所有 session_set_cookie_param 调用,这会产生奇怪的效果。更好的是,如果你显式调用 setcookie(session_name(),blah blah blah),php 仍然不会发出 cookie。

所以,让我们强制 php 发出一个 cookie。

选项 1

这通过使用不会破坏现有会话的唯一值调用 session_id 来实现。 http://php.net/session_id 的文档指出

注意:使用会话 cookie 时,为 session_id() 指定 id 将始终在调用 session_start() 时发送一个新 cookie,无论当前会话 id 是否与设置的相同。

session_id($_COOKIE[session_name()]);

所以不管怎样,现在是早上 6 点,我还没有睡觉,你可能在几个月甚至几年前就知道了,但到底是什么,也许我会拯救别人我生命中的 2 或 3 个小时永远不会回来。哈哈。

【讨论】:

  • 一年多过去了,你的代码帮助了我!它完全符合我的需要:在每次页面加载时延长 cookie 过期时间。我在session_start(); 之前添加了它。谢谢...来自未来!
猜你喜欢
  • 1970-01-01
  • 2013-03-12
  • 1970-01-01
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2020-10-09
  • 2011-02-18
  • 1970-01-01
相关资源
最近更新 更多