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

dehex($tout + NNN) を使用してこれを修正しました。さらにテストすると、この問題は私の 32 ビット WAMP インストールでのみ発生することがわかりました。私の 64 ビット CentOS サーバーでは問題はありませんでした。

私は今、何がうまくいかないのかを理解しました。PHP のデフォルトのセッション ストレージは、$_SESSIONS 変数をシリアル化します。「tout」要素が 32 ビットの整数として扱われていたため、逆シリアル化が失敗していました。

さらに注意してください-セッションが閉じられてシリアライズされるまで、PHPはサイレントに値をdoubleに変換するため、SESSIONS配列は正しいコンテンツを表示します。

于 2013-04-20T07:24:21.397 に答える
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 に答える