【问题标题】:How do I create persistent sessions in PHP?如何在 PHP 中创建持久会话?
【发布时间】:2012-04-05 13:49:24
【问题描述】:

我使用session_start() 在 PHP 中启动会话,但是当我的浏览器关闭时,会话就消失了。

如何使用 PHP 创建在浏览器关闭时持续存在的持久会话?

【问题讨论】:

  • 听起来像是 cookie 的工作
  • 使用 cookie。例如,this tutorial

标签: session-cookies php


【解决方案1】:

您可以在不输入session_start() 的情况下启动会话,并且可以使用这样的cookie 启动它

setcookie('PHPSESSID','any id' , any time);

可以这样做,因为当您键入 session_start() 然后尝试像这样查看 cookie 时

print_r($_COOKIE);

那么输出将是:

Array ( [PHPSESSID] => c0voj7h0b4aesddkc17a6jk7c3 )

自己试试吧

【讨论】:

    【解决方案2】:

    如果您想要持久会话,我建议您使用 cookie 和数据库。我们将客户的 ID(随机 32 位字母数字值)存储在 cookie 中,然后引用它来加载他们的客户信息。

    【讨论】:

      【解决方案3】:

      查看php.inisession.cookie_lifetime

      0的默认值表示在浏览器关闭时结束会话。

      您可以直接在php.ini 中覆盖此值,也可以在使用ini_set 开始会话之前在您的应用程序中设置它。将其设置为大于 0 的值将导致会话在该持续时间内有效。

      例如

      ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7);  // 7 day cookie lifetime
      session_start();
      

      上述示例导致会话 cookie 设置为会话开始后 7 天的过期时间。

      注意:如果您从同一段代码为所有网页启动会话,则每次调用 session_start() 时都不会继续延长会话到期时间。 cookie 生命周期是从会话第一次启动时开始设置的,而不是在后续请求时设置的。如果您想将会话的生命周期从当前时间延长 7 天,另请参阅 session_regenerate_id()

      另请注意:如果您的 session.gc_maxlifetime 值设置为小于会话 cookie 的长度,您可能会遇到用户 5 天未访问该站点的情况,并且何时他们返回,会话 cookie 不再有效,因为服务器上的数据已被删除。为了解决这个问题,您还应该将此会话数据的生命周期设置为至少与您的 cookie 生命周期一样长。正如手册所述,可能需要使用自定义session.save_path 来保存您希望比默认值更长的会话数据。因此,您的脚本可能如下所示:

      ini_set('session.cookie_lifetime', 60 * 60 * 24 * 7);
      ini_set('session.gc_maxlifetime', 60 * 60 * 24 * 7);
      ini_set('session.save_path', '/home/yoursite/sessions');
      session_start();
      

      【讨论】:

      • 我对此有一些疑问: 1. 它适用于共享主机吗? 2. 保存路径是home/www.mysite.com/sessdir?或者只是一个目录,我尝试在共享主机上执行此操作似乎不起作用,cookied 值发送到浏览器但服务器没有重新识别它。
      【解决方案4】:

      会话被设计成基于“会话”。换句话说,如果您关闭浏览器(本质上是您的会话),它应该会消失。

      您可以尝试将会话数据存储在数据库中而不是文件中。将会话 ID 和会话数据存储在一个表中。然后从 cookie PHPSESSID 中调用会话 ID(默认情况下)并从您的数据库中查找会话数据。

      【讨论】:

      • 如果 Cookie 设置为在浏览器关闭时消失,那么将会话存储在数据库中不会使会话持久化...取决于您对垃圾收集和销毁方法的编程方式可能正在保存会话数据,但如果在关闭并重新打开浏览器后将 maxlife 设置为 0,则用户将拥有一个包含新会话数据的新会话 ID。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-23
      相关资源
      最近更新 更多