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();