0

我遇到了一个让我发疯的 PHP 会话的奇怪问题。这是我正在做的事情的要点

$tout = time();
session_start();
$_SESSION['dna'] = md5($_SERVER['HTTP_USER_AGENT']);
if (1 == $user->demo) 
    $_SESSION['demo'] = $user->demo;
$_SESSION['tout'] = $tout;

这似乎工作得很好。然而,这种变体

$tout = time();
session_start();
$_SESSION['dna'] = md5($_SERVER['HTTP_USER_AGENT']);
if (1 == $user->demo) 
{
    $_SESSION['demo'] = $user->demo;
    $tout += 900;
} else 
    $tout += 7200;
$_SESSION['tout'] = $tout;

丢弃整个 $_SESSION 数组。

简而言之,我想要做的是跟踪用户会话在每次与服务器的后续交互时确定会话是否应标记为超时并相应地通知用户。在演示模式下超时应为 900 秒,否则为 7200 秒。

也许我的 32 位本地 WAMP 服务器上的整数算术存在问题,尽管我对此表示怀疑,因为我在其中执行算术并回显结果的简单测试脚本有效。这表明将结果存储在会话数组中存在某种问题。

这正在驱使我绕过弯道,我确信这里有一些明显的东西我没有看到。任何帮助将非常感激。

4

3 回答 3

0

尝试这个..

<?php
    session_start();
    $_SESSION['tout'] = time();

    $_SESSION['dna'] = md5($_SERVER['HTTP_USER_AGENT']);

    if (1 == $user->demo) 
    {
     $_SESSION['demo'] = $user->demo;
     $_SESSION['tout'] = $_SESSION['tout'] + 10 * 60  // for example 10 minutes
    } 
    else 
     $_SESSION['tout'] = $_SESSION['tout'] + 20 * 60  // for example 20 minutes
?>
于 2013-04-20T05:38:40.243 回答
0

如果你这样做会发生什么:

session_start();
$_SESSION['dna'] = md5($_SERVER['HTTP_USER_AGENT']);
if (1 == $user->demo) 
{
 $_SESSION['demo'] = $user->demo;
 $tout = time()+900;
} else $tout = time()+7200;
$_SESSION['tout'] = $tout;
于 2013-04-20T05:45:31.800 回答
0

我通过使用 dechex($tout + NNN) 解决了这个问题。在进一步测试中,我发现这个问题只出现在我的 32 位 WAMP 安装上。在我的 64 位 CentOS 服务器上没有问题。

我现在也弄清楚出了什么问题。PHP 的默认会话存储序列化 $_SESSIONS 变量。'tout' 元素被视为 32 位整数,然后反序列化失败。

进一步说明 - 直到会话关闭并被序列化为止,SESSIONS 数组显示正确的内容,因为 PHP 默默地将值转换为双精度值。

于 2013-04-20T07:24:21.397 回答