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

时间:2012-05-25 11:41:30

标签: php session timeout

我遇到了$_SESSION问题,而$_SESSION随机丢失了数据。

我有一个包含不同页面的表单,用户有足够的时间来浏览所有页面。

所以我在第一页上设置了一个会话变量,并在其他页面上进行检查。

start.php

 <?php
    session_start();  

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

app_init.php

<?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
}

之后开始页面:

<?php

// get basic settings for applications 
require_once (MODEL_PATH.'/app_init.php');

整个系统在本地安装,Developmentserver和Testserver上运行良好。在Productionserver上,我在不同的时间获得超时。它不同于30秒到10分钟。 MAX_TIMELIMIT是20分钟。在这种情况下,$_SESSION['STARTED']始终为空。在其他环境中,即使超时在20分钟后显示,也会正确设置。

添加个人信息:

  • 如果我尝试访问下一页或者只是重新加载实际页面并不重要,我总会得到超时。
  • 我已在任何环境中检查php.ini - &gt; session.save_path已正确设置,session.cookie_lifetime为0且session.gc_maxlifetime为1440
  • Diskspace很好(> 22 GB免费)
  • 每个文件都在同一台服务器上并且具有相同的网址(除了指定表单步骤的最后一部分。看起来像这样:
    host / some / path / calc - &gt;主持人/某些/路径/表格 - &gt;主持人/某些/路径/摘要 - &gt;主机/一些/路径/发送
  • 会话在calc页面上设置,超时可能发生在每个页面上(计算,表单,摘要)
  • 我从生产服务器获取了php.ini并将其带入我的本地工作区。在更改了一些路径(extensions-path,session.save_path,tmp-path)之后,它在本地安装上运行得非常好。
  • 协议是一样的所有页面
  • 重新创建会话(通过$tmpsession_destroy()session_create())没有帮助
  • 单前端,没有负载均衡器(只是一个apache)
  • 以某种方式删除会话文件

添加一些输出并重新测试后,我得到以下内容:

  • 我加载了页面(第一步)
  • 我浏览表单到任何步骤(计算/表格/摘要)
  • 页面加载时
  • $_SESSION

    array ( 'STARTED' => 1338298801, 'S_SID_' => '41554681145546', 'S_LC_' => 'de', 'version_testing' => 1, )

  • 我每30秒重新加载一次页面

  • 至少3分钟后(也可能是30秒)我得到超时,$_SESSION是:

    array ( )

  • 如果我在第一页上尝试此操作,我会在$_SESSION中获得一个新值,因为sessiondata为空且自动为新设置。

  • 要记住:在测试/开发环境中,会话数据仍然存在,即使超时发生在20分钟后。

  • 首先更改session.save_path似乎有效(会话至少持续24分钟)。但一小时后,仍然是同样的问题。没有会话持续超过4分钟。

发现问题(但尚无解决方案)
今天我获得了访问Production-Server,我发现,会话数据的文件夹在3-5分钟后被清理干净。没有文件的时间戳超过3分钟。 如前所述,PHP已正确设置(GC生命周期),并且我没有找到任何Windows作业,或者类似于删除这些文件的内容。正确设置PHP.ini后,我将尝试通过数据库处理会话。

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

在这种特定情况下有效:

另一个网站是同一服务器上的hostet,但是在不同的虚拟主机中。该网站使用了“init.php”,每次请求都会调用它。它包含一行将gc_maxlifetime设置为0并在之后开始一个会话。因此,在某个请求中,所有sessiondata都被第二个网站清除。

On Test and Dev这不是问题,因为这两个环境并没有那么多使用......

答案 1 :(得分:1)

这是一种常见的行为,当我们在带有负载均衡器的多个前端上托管PHP网站时,我已多次看到这种行为。默认情况下,PHP会在文件系统上存储会话,具体取决于您所在的会话,您可以启动一个或另一个会话。

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

答案 2 :(得分:0)

乍一看(没有更多信息),似乎您的会话可能在实际开始之前就开始了。毫无疑问,这会导致这个问题。如果这可能是问题,请试试这个。

$tmp = $_SESSION;
session_destroy();
session_start();
$_SESSION = $tmp;
$_SESSION['started'] = time();

此外,如果您正在访问子域等,那么您的会话将不存在。它仅存在于设置时所处的确切域。

提供更多信息也可能有所帮助。存在问题的网页页面。在页面上添加一些var_dump($_SESSION),并在您单步执行时查看其输出内容。当您发现更改时,请确定更改的位置和原因。