我遇到了$_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 $tmp
和session_destroy()
,session_create()
)没有帮助添加一些输出并重新测试后,我得到以下内容:
$_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后,我将尝试通过数据库处理会话。
感谢您的帮助
答案 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)
,并在您单步执行时查看其输出内容。当您发现更改时,请确定更改的位置和原因。