【问题标题】:php PHPSESSID exists but session destroyedphp PHPSESSID 存在但会话被破坏
【发布时间】:2023-03-04 12:08:01
【问题描述】:

如果用户登录时记得我检查,我正在尝试登录用户 2 周,然后我在会话中设置了一些变量,并且 cookie 设置了 2 周。它设置正确,我已经打印并得到了值session_cookie_lifetime = 1209600session_gc_maxlifetime = 1209600。我还打印了会话并在$_SESSION 中获得了正确的值。

登录我的网站后,当我关闭计算机并重新打开我的网站时,它似乎正在运行(它让我成为登录用户)。但是当我关闭我的电脑时,第二天当我打开我的浏览器时,它无法正常工作,并且显示我没有登录我的网站。我已经打印了 $_COOKIE$_session 。它表明在cookie中有:

[PHPSESSID] => svikos35bgclmebk2cqraiddt2

但是会话是空的。

我得到了这个表单 modx 的东西:

MODx 会根据对站点的每个请求自动启动和结束会话。您可以简单地将值保存到 $_SESSION 数组中,它们将保存在请求之间,以便您可以在后续页面上使用它们(只要您具有相同的用户会话)。除了不要自己调用会话函数来启动、结束或以其他方式操作会话配置之外,它并没有什么魔力——这一切都可以通过 MODx 中的设置来完成。

我正在使用 modx revo。这是一个有点描述性的问题。让我知道你需要别的东西。 任何可能对我有帮助的东西(博客链接、任何设置、任何建议)都将不胜感激。
提前致谢

【问题讨论】:

  • RTFM: php.net/session_destroy "如果 cookie 用于...那么 cookie 必须被删除"。 session_destroy 几乎等同于 $_SESSSION = array(),除了会话内容之外不会破坏任何其他内容。
  • 会话只持续到浏览器关闭。您可能需要从 cookie 重新创建会话。
  • 如果我需要重新创建会话,那么我认为每次关闭浏览器后会话都应该为空。但是在浏览器重新启动后它在会话中具有所有值。它只有在我登录后第二天打开浏览器时才消失。实际上由 modx 自动处理的会话和 cookie。据我所知,我只需要设置它
  • @bansi 你错了。会话可能会在服务器上持续一周或更长时间。它保存在 php session 目录中(例如),有时当这个目录溢出时服务器会失败
  • @BaBL86 会话可能存在于服务器中,但是如果浏览器不向服务器发送会话详细信息,服务器如何确定哪个会话属于哪个浏览器?并且标准浏览器在浏览器关闭后不会保留会话详细信息。

标签: php session cookies modx-revolution


【解决方案1】:

这只会在一天后发生? tmpwatch 可以从服务器中删除会话文件吗?

【讨论】:

  • 是的,这是一天后发生的。你能再解释一下吗?
  • tmpwatch 是一个命令,通常写入一个 cron 脚本,该脚本会在一段时间后删除 /tmp 目录中的所有文件 [通常每 24 小时一次] linux.about.com/library/cmd/blcmdl8_tmpwatch.htm 如果发生这种情况,你可能会能够设置使用不同 tmp 目录的自定义 php.ini。
  • 谢谢。实际上就是这样。它正在删除服务器中的会话文件。
【解决方案2】:

session_cookie_lifetimesession_gc_maxlifetime 不向您保证,该会话将保存一周。 GC 杀死未使用的会话。检查有关此参数的 PHP 文档,您会看到,您无法确定您的会话将在服务器上,并且您不确定您的会话将在此时间后被销毁。 GC 是异步的。

如果 $_SESSION 不存在,您需要在登录(和自动登录)后重新创建它。

查看这篇文章(俄语,尝试谷歌翻译: PHP GC: unexpected behavior

【讨论】:

  • “正确”是什么意思?如果您关心安全性,例如,从 user_id 和 pwd 将 md5 或 sha hash 添加到您的 cookie 和登录时间(您还需要在用户配置文件中保存登录时间,在 mysql 的用户表中)并检查它。跨度>
  • 我想知道如何确保 cookie 设置为 1209600
  • 这是不可能的。用户可以清除他的 cookie 或防火墙/防病毒软件。检查此值 server-sede(例如,通过 login_time 先前保存。如果 diff 超过 1209600 - 销毁 cookie)。
【解决方案3】:

SESSION 背后的基本思想是,当您创建或调用session_start() 方法时,您的服务器会生成一个会话ID 并将其存储在服务器内存中。此外,服务器会在您的客户端计算机上创建一个 cookie,该 cookie 包含一个与您的服务器端会话 id 相关的 id。当您调用 session_destroy() 方法时,服务器会在服务器端删除该 ID,但客户端 cookie 不会。这就是您的会话 ID 仍然显示的原因。您还可以通过缓存和 cookie 清除来检查。当您清除 cookie 时,您的会话将被破坏。

【讨论】:

  • 这是否意味着它没有为 1209600 设置 cookie?如果是,那为什么?
  • 不,只是这么想。当您在清除浏览器缓存和 cookie 后进入您的 Gmail 帐户时,您将自动注销。因为浏览器上的会话被清理了。
猜你喜欢
  • 2013-10-31
  • 2016-04-28
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
相关资源
最近更新 更多