【发布时间】:2012-04-05 13:49:24
【问题描述】:
我使用session_start() 在 PHP 中启动会话,但是当我的浏览器关闭时,会话就消失了。
如何使用 PHP 创建在浏览器关闭时持续存在的持久会话?
【问题讨论】:
-
听起来像是 cookie 的工作
-
使用 cookie。例如,this tutorial。
标签: session-cookies php
我使用session_start() 在 PHP 中启动会话,但是当我的浏览器关闭时,会话就消失了。
如何使用 PHP 创建在浏览器关闭时持续存在的持久会话?
【问题讨论】:
标签: session-cookies php
您可以在不输入session_start() 的情况下启动会话,并且可以使用这样的cookie 启动它
setcookie('PHPSESSID','any id' , any time);
可以这样做,因为当您键入 session_start() 然后尝试像这样查看 cookie 时
print_r($_COOKIE);
那么输出将是:
Array ( [PHPSESSID] => c0voj7h0b4aesddkc17a6jk7c3 )
自己试试吧
【讨论】:
如果您想要持久会话,我建议您使用 cookie 和数据库。我们将客户的 ID(随机 32 位字母数字值)存储在 cookie 中,然后引用它来加载他们的客户信息。
【讨论】:
查看php.ini 值session.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();
【讨论】:
会话被设计成基于“会话”。换句话说,如果您关闭浏览器(本质上是您的会话),它应该会消失。
您可以尝试将会话数据存储在数据库中而不是文件中。将会话 ID 和会话数据存储在一个表中。然后从 cookie PHPSESSID 中调用会话 ID(默认情况下)并从您的数据库中查找会话数据。
【讨论】: