【问题标题】:why is my PHP session expiring prematurely?为什么我的 PHP 会话过早到期?
【发布时间】:2012-08-18 20:09:54
【问题描述】:

根据 Chrome,我的网站的 PHPSESSID cookie 过期设置为

Expires:    Monday, November 26, 2012 2:46:39 PM

但会话仅在几个小时后到期。我在每一页上调用 session_start() 。阅读为类似问题提供的解决方案,我尝试设置

ini_set("session.cache_expire",300*24*60*60);

ini_set("session.gc_maxlifetime",100*24*60*60);

session_start() 之前,但这并没有解决问题。 (它们的初始值分别设置为 180 和 1440。)

我在共享服务器上,另一个建议是更改默认 tmp 目录,使其不是根目录(某些垃圾收集过程可能会删除 cookie),所以我这样做了

$docroot = $_SERVER['DOCUMENT_ROOT'];
$tmpdir = "$docroot/tmpx";
session_save_path($tmpdir);

这并不能解决问题。 (我在其他浏览器中也有同样的问题,而不仅仅是 Chrome。)我还可能做错什么?

更新:我将当前会话的文件保存在本地,然后在几个小时后尝试登录。虽然 Chrome 中的 PHPSESSID cookie(即,其内容是此会话文件名称的 cookie)仍按预期以未来 100 天的日期存储,但服务器上的实际会话文件现在不包含任何数据。 (它存在,但它是 0 字节而不是之前的 192 字节。)所以看起来会话文件没有被删除,但内容正在被删除。

【问题讨论】:

  • 尝试更改 php.ini 或 httpd.conf 文件中的值。一些设置不能通过 ini_set() 设置,可能就是其中之一
  • 查看浏览器从服务器获取的 Cookie。此外,我认为,某些 Linux 发行版上的 cron 可能会清除会话。
  • @alecwhardy: php.net/manual/en/ini.list.php -- 基本会话内容都是 PHP_INI_ALL。
  • @alecwhardy 在使用 ini_set() 设置它们之后,我使用 ini_get() 检查值,并分别为 session.cache_expire 和 session.gc_maxlifetime 获得了 25920000 和 8640000 的值,所以它看起来像ini_set() 正在设置值。
  • @PhilippGrassl 我在 Chrome 中查看了 cookie 的到期日期,它似乎是正确的(未来 100 天)。

标签: php


【解决方案1】:

没有正确处理会话数据的可能原因有很多。最有可能的是,会话并未在每个加载并使用数据的页面上启动。要解决此问题,请确保 session_start() 在每个被调用或重定向到的页面上启动。此外,如果您对会话配置(例如,ini_set())进行任何更改,请确保将其应用于全局或每个页面。要全局应用它,请添加

php_flag session.gc_maxlifetime <your value>
php_flag session.cache_expire <your value>

到您的 .htaccess 文件。或者,您可以添加

ini_set("session.gc_maxlifetime", <value>);
ini_set("session.cache_expire", <value>);

在调用 session_start() 的每个页面上的 session_start() 之前。

【讨论】:

  • 我发现了一个通过 ini_set 函数而不是在 php.ini 中设置 session.gc_maxlifetime 的陷阱。在 Ubuntu 14.4(可能是所有 debian 变体)上,cron 作业定期扫描它可以找到的所有 php.ini 文件,并提取 gc_maxlifetime 的最大值。然后使用该值删除任何修改时间比该值更长的文件。结果是使用了 php.ini 中的值,而不是使用 ini_set 设置的值。症状仍然有 cookie,但没有会话文件。
【解决方案2】:

session_start()之前添加这个:

ini_set('session.use_cookies', 1);
ini_set('session.cookie_lifetime', 300*24*60*60);

基于文件的会话可能会因多种原因在您的系统上中断。尝试使用基于数据库的会话,看看是否能解决问题。

【讨论】:

    猜你喜欢
    • 2012-10-02
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 1970-01-01
    相关资源
    最近更新 更多