为什么我的PHP会话提前到期?

为什么我的PHP会话提前到期?,php,Php,根据Chrome,我的站点的PHPSESSID cookie过期时间设置为 Expires: Monday, November 26, 2012 2:46:39 PM 但该会话仅在几个小时后过期。我在每页上调用session_start()。阅读针对类似问题提供的解决方案,我尝试设置 ini\u集(“session.cache\u expire”,300*24*60*60) 及 ini\u集(“session.gc\u maxlifest”,100*24*60*60) 在会话之前\u s

根据Chrome,我的站点的PHPSESSID cookie过期时间设置为

Expires:    Monday, November 26, 2012 2:46:39 PM
但该会话仅在几个小时后过期。我在每页上调用session_start()。阅读针对类似问题提供的解决方案,我尝试设置

ini\u集(“session.cache\u expire”,300*24*60*60)

ini\u集(“session.gc\u maxlifest”,100*24*60*60)

会话之前\u start()
但这并没有解决问题。(其初始值分别设置为180和1440。)

我在一个共享服务器上,另一个建议是更改默认的tmp目录,使其不是根目录(某些垃圾收集进程可能正在删除cookies),因此我使用

$docroot = $_SERVER['DOCUMENT_ROOT'];
$tmpdir = "$docroot/tmpx";
session_save_path($tmpdir);
这并不能解决问题。(我在其他浏览器中也有同样的问题,不仅仅是Chrome。)我还可能做错什么


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

会话开始()之前添加此项。


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

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

php_flag session.gc_maxlifetime <your value>
php_flag session.cache_expire <your value>
php\u flag session.gc\u maxlifetime
php_标志session.cache_过期
到您的.htaccess文件。或者,您可以添加

ini_set("session.gc_maxlifetime", <value>);
ini_set("session.cache_expire", <value>);
ini_集(“session.gc_maxlifetime”);
ini_集(“session.cache_expire”);

在调用会话启动()的每个页面上的会话启动()之前

尝试更改php.ini或httpd.conf文件中的值。ini_set()无法设置某些设置,这可能是其中之一。请查看浏览器从服务器获取的Cookie。此外,我认为,在某些linux发行版上,会话可能会被cron清除。@alecwhardy:--基本会话内容都是PHP_INI_all。@alecwhardy我用INI_get()检查了我用INI_set()设置的值,session.cache_expire和session.gc_maxlifetime分别得到了25920000和8640000的值,所以看起来ini_set()确实在设置值。@PhilippGrassl我在Chrome中查看了cookie的过期日期,它似乎是正确的(未来100天)。我通过ini_set函数而不是在php.ini中找到了设置session.gc_maxlifest的方法。在Ubuntu14.4(可能是所有debian变体)上,cron作业定期扫描它能找到的所有php.ini文件,并提取gc_maxlife的最大值。然后,该值用于删除任何修改时间早于该值的文件。结果是使用了php.ini中的值,而不是使用ini\u set设置的值。症状仍然有一个cookie,但没有会话文件。
ini_set("session.gc_maxlifetime", <value>);
ini_set("session.cache_expire", <value>);