Php 会话不能长时间保留,它将自动销毁

Php 会话不能长时间保留,它将自动销毁,php,session,Php,Session,我的会话有问题,我的会话在几分钟不活动后自动被销毁,我想它必须是24分钟,即1440秒。我想会话保持很长时间,我正在服务器上使用.user.ini文件,并将session.gc_maxlife设置为31557600秒,将session.cookie_life设置为31557600秒,但我什么也没发生。在1440秒的不活动后,它仍然注销。我还附加了phpinfo的png图像的会话值。 我希望您的回答或任何帮助对我有用。谢谢。如前所述: 最好的解决方案是实现自己的会话超时。使用 简单的时间戳,表示最

我的会话有问题,我的会话在几分钟不活动后自动被销毁,我想它必须是24分钟,即1440秒。我想会话保持很长时间,我正在服务器上使用.user.ini文件,并将session.gc_maxlife设置为31557600秒,将session.cookie_life设置为31557600秒,但我什么也没发生。在1440秒的不活动后,它仍然注销。我还附加了phpinfo的png图像的会话值。 我希望您的回答或任何帮助对我有用。谢谢。

如前所述:

最好的解决方案是实现自己的会话超时。使用 简单的时间戳,表示最后一个活动的时间(即。 请求)并随每个请求更新:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
使用每个请求更新会话数据也会更改会话 文件的修改日期,以便会话不会被 垃圾收集器过早损坏


我不确定您的设置为什么不起作用,但我在脚本中使用以下命令覆盖
会话maxlifetime
会话保存路径的
php.ini
设置:

session_save_path('/pathto/writable/dir/on/your/account');
ini_set('session.gc_maxlifetime', 24*60*60); // 24 hours; change as necessary
session_start();

注意:

会话保存路径
很重要,因为默认的
路径
/tmp
,系统管理员可能会每天/每周删除它?基础。

根据我的经验,它总是与
php.ini
文件相关。在您的情况下,
session.gc\u maxlifest
的主值和本地值相互矛盾。(gc代表垃圾收集)它们不必彼此一致,因为本地值用于运行的脚本。这只意味着系统上有两个php.ini文件,位于不同的位置,而本地php.ini文件将覆盖主php.ini文件设置。但是,我非常怀疑服务器上的任何文件,它们调用的是主php.ini文件,或者在脚本本身中调用
ini\u集(…)
。其工作方式是,无论该值设置为什么,它只有在进行垃圾收集时才有意义。垃圾收集由
session\u start()
完成,但您也可以通过其他方式触发垃圾收集,如本文后面介绍的cronjob或cronjob。调用时,它会检查存储会话信息的服务器上文件的上次修改时间。如果此后经过的秒数大于当前的
session.gc\u maxlifest
值,它将销毁会话。注意:这是最后一次修改的时间,而不是最后一次访问的时间,因此您需要经常更改会话数据,以防止在会话数据未更改时将其删除。您还应该注意,这里有一个名为“会话.延迟写入”的设置,如果启用,并且默认启用,则在会话数据未更改的情况下,该设置不会更新会话文件的上次修改时间。因此,如果您希望将会话因未知原因提前销毁的可能性降至最低,或者在会话上存储时间戳,以便数据始终在更改,并且您知道会话上次使用的时间,如果旧,您可以手动调用。要启动另一个会话,可以使用提交,然后调用
会话\u start()
。或者,使用一次完成所有3项

接下来,如果您使用所需设置使用
session\u start()
初始化会话,并在每个请求中继续使用所需设置调用
session\u start()
,则非常棒。但是,一旦服务器上的任何文件调用了
session\u start()
,而
session.gc\u maxlifest
的值不同,无论是在您的情况下使用master php.ini值,还是脚本调用并忽略master值,它将根据不同的值检查文件的上次修改时间,并销毁您的会话,不管您的预期设置如何——假设它被选为必须进行垃圾收集的100个请求中的1个

另一件需要关注的事情是
session.cookie\u life
。此处的值为0将cookie转换为浏览器会话cookie。这意味着如果用户关闭浏览器,则浏览器将删除会话cookie。您的主值正在使用0。但您的本地值使用31557600(一年中的平均秒数)。所以你在这里应该很好。但是,如果服务器上有脚本覆盖此值,请保持警惕,使用
0
,或使用主php.ini文件

您还应该知道,会话将被销毁的默认垃圾收集概率为1%,如
session.gc\u probability
session.gc\u除数
所定义,这两个除数分别默认为1和100。在调用
start\u session()
时,如果且仅当“随机”选择请求作为管理垃圾收集的请求时,垃圾收集才会完成。这意味着,即使某个会话过期所需的定义秒数已过,
start\u session()
仍然不会对该过期会话进行垃圾收集。相反,大多数用户会注意到,由于浏览器跟踪其时间戳过期的cookie,他们的会话完全按照计划过期。但是,在调用
start\u session()
时,根据垃圾收集更改进行PHP垃圾收集之前,不会强制执行会话。如果您想在会话过期后将其清除,并启动一个新会话,则应该使用。此处的
true
意味着丢弃绑定到上一个会话的
$\u会话
数据,并向它们抛出一个不同的会话id,就像它们的会话已过期一样

您还应该知道,一些系统,例如基于debian的系统,有一个cronjob,它每30分钟运行一次,根据主php.ini配置信息进行垃圾收集。 硒