2012-05-25 38 views
3

我陷入了$_SESSION问题,而$_SESSION是随机丢失数据。PHP会话数据丢失 - >会话文件被删除太快

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

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

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

整个系统在本地安装,开发服务器和测试服务器上工作得很好。在生产服务器上,我在不同的时间得到一个超时。它从30秒到10分钟不等。 MAX_TIMELIMIT是20分钟。在这种情况下,$_SESSION['STARTED']总是空的。在其他环境中,即使在20分钟后出现超时,它也可以正确设置。

产生额外的信息:

  • 如果我试图达到一个新的页面,或者如果我只需重新加载实际的页面,我总是超时没关系。
  • 我已经在任何环境检查php.ini - >session.save_path设置正确,session.cookie_lifetime是0和session.gc_maxlifetime是1440
  • 磁盘空间是好的(>免费22 GB)
  • 每个文件是在同一台服务器上,并且具有相同url(除了最后一部分指定了窗体的步骤),看起来像这样:
    host/some/path/calc - > host/some/path/form - > host/some/path/summary - > host/some /路径/发送
  • 会话设置在计算页面上,并且每个页面上都可能发生超时(计算,表格,汇总)
  • 我从生产服务器获得了php.ini,并将其带入我的本地工作区。更改一些路径(extensions-path,session.save_path,tmp-path)后,它在我的本地安装上运行得非常好。
  • 协议是所有页面相同
  • 要重新创建会话(通过$tmpsession_destroy()session_create())并没有帮助
  • 单前端,没有负载均衡器(只是一个阿帕奇)
  • 会话文件不小心删除

加入一些输出和重新测试后,我得到如下:

  • 我加载页(第一步骤)
  • 我经过的形式的任何步骤(计算值/形式/摘要)
  • 当页面被加载$_SESSION

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

  • 我重装该页面每三十秒

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

    array ( )

  • ,如果我尝试这第一页上,我得到了$_SESSION一个新值,作为sessiondata是空的,全自动的新集。

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

  • 更改session.save_path第一次似乎工作(会话持续至少24分钟)。但一小时后,仍然是同样的问题。没有会话持续4分钟以上。

发现问题(但没有解决方案还)
今天我访问生产服务器,我发现,与会话数据的文件夹中3-5分钟后清理。没有文件的时间戳超过3分钟。 如前所述,PHP设置正确(GC生命周期),我没有找到任何Windows作业,或类似的东西删除这些文件。由于PHP.ini设置正确,我将尝试通过数据库处理会话。

感谢您的帮助

+1

确保生产服务器着手举行会议的所有设置。您正在使用托管服务器还是专用服务器? – badc0re

+0

你如何存储你的会话?数据库,文件或memcache? – Ray

+0

嗨, 这是一个专用的服务器。我们将会话存储在文件中,并且设置都已设置。 (据我所见) – Kelzama

回答

2

什么在这种特定情况下的工作:

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

在测试和开发,这不是一个问题,因为这两种环境都不算多用...

0

乍一看(没有更多的信息),它似乎是可能的时间应已实际开始之前,你的会话启动。这无疑会导致这个问题。如果这可能是问题,那就试试这个。

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

另外,如果您正在访问某个子域名或类似位置,则您的会话将不存在。它只存在于设置时的确切域。

提供更多信息可能也有帮助。存在问题的网页的网址。在页面上添加几个var_dump($_SESSION),并在您逐步浏览时查看它输出的内容。当你发现一个变化时,找出它改变的地方和原因。

+0

嗨, 我在评论中添加了一些转储。 我编辑主要信息的进一步信息 – Kelzama

1

这是我多次看到PHP网站托管在多前端与负载平衡器多次的常见行为。由于默认情况下PHP会在文件系统上存储会话,因此您根据哪个前端启动了一个或另一个会话。

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