PHP丢失会话数据->;会话文件删除得太快

PHP丢失会话数据->;会话文件删除得太快,php,session,timeout,Php,Session,Timeout,我陷入了一个$\u会话问题,而$\u会话正在随机丢失数据 我有一个不同页面的表单,用户有特定的时间浏览所有页面 因此,我在第一个页面上设置了一个会话变量,并在其他页面上检查它 start.php <?php session_start(); //Set Variable for Starting application if (!isset($_SESSION['STARTED'])){ $_SESSION['STARTED'] = time

我陷入了一个
$\u会话
问题,而
$\u会话
正在随机丢失数据

我有一个不同页面的表单,用户有特定的时间浏览所有页面

因此,我在第一个页面上设置了一个会话变量,并在其他页面上检查它

start.php

 <?php
    session_start();  

    //Set Variable for Starting application
    if (!isset($_SESSION['STARTED'])){
        $_SESSION['STARTED'] = time();
    }
<?php
session_start();

if ((!isset($_SESSION['STARTED'])) || (time() - $_SESSION['STARTED'] > MAX_TIMELIMIT)) {
    echo '<!-- st: '.$_SESSION['STARTED'].'-->';
    // Started Variable is not set or timelimit is over.
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    showTimeout('0');   //  show timeout
}
乍一看(没有更多信息),您的会话似乎是在实际启动时间之前启动的。这无疑会导致这个问题。如果这可能是个问题,试试这个

$tmp = $_SESSION;
session_destroy();
session_start();
$_SESSION = $tmp;
$_SESSION['started'] = time();
此外,如果您正在访问子域或类似的内容,您的会话将不存在。它只存在于它设置时所在的确切域中


提供更多的信息也会有所帮助。存在问题的页面的URL。在页面上添加一些
var\u dump($\u SESSION)
,并在逐步完成时查看它的输出。当您注意到更改时,请找出更改的位置和原因。

当PHP网站使用负载平衡器托管在多个前端时,这是我多次看到的常见行为。默认情况下,PHP将会话存储在文件系统上,这取决于您所处的前端,因此启动了一个或另一个会话


简单的解决方案是将会话存储到数据库中,即使我对负载平衡器的看法是错误的,您也应该尝试直接在文件系统上读取会话数据,检查到底发生了什么(PHP是否正在删除数据?数据是否仍在此处,但生成了另一个会话令牌?等等).

在这种特定情况下起作用的是:

另一个网站位于同一服务器上,但位于不同的虚拟主机中。这个网站使用了一个“init.php”,每个请求都会调用它。它包含一行,该行将gc_maxlifetime设置为0,然后启动会话。因此,在某些请求下,所有sessiondata都被第二个网站清除了


在Test和Dev上,这不是问题,因为这两个环境没有太多使用…

请确保生产服务器设置了所有关于举行会话的设置。您正在使用托管服务器或专用服务器?如何存储会话?数据库、文件或memcache?嗨,这是一个专用服务器。我们正在将会话存储在文件中,所有设置都已设置。(据我所知)您是否在http和https等协议之间切换?嗨,我在评论中添加了一些转储。我用更多的信息编辑了主帖
$tmp = $_SESSION;
session_destroy();
session_start();
$_SESSION = $tmp;
$_SESSION['started'] = time();