この PHP スクリプト (AJAX によって呼び出される) がランダムにセッションを正しくロードしないのはなぜですか? 質問する

この PHP スクリプト (AJAX によって呼び出される) がランダムにセッションを正しくロードしないのはなぜですか? 質問する

アホイ、StackOverflow、

私のプロジェクトでこの問題に遭遇しました。簡単に言うと、私が収集した情報によると、AJAX 経由で呼び出された PHP スクリプトが、index.phpページの上部に設定された SESSION 変数を適切に登録していないということです。最初は、セッション ロックが原因だと思い、先に進んで を追加しましたsession_write_close()が、問題は解決しませんでした。

この問題は25%程度の割合でしか発生しません新しいユーザーセッションが開始した後(例: ユーザーがログインしたとき)。

私はバグを再現するために必要な最小限のコーディングにまで減らすために、コードの 90% を削除しました。

ajax.php 経由の Firebug からの不正な結果

画像

ajax.php 経由の Firebug からの期待される結果

画像2

注: 両方の結果にはインデックスの戻り値が表示されるprint_r($_SESSION)ため、Array ( [userid] => 3724 [trialstatus] => 1 [trialtcompletions] => 0 [userlevel] => 5 )問題はインデックス ページで設定されているセッションに関係していないことがわかります。

AJAX 経由で呼び出されたスクリプトがセッション変数に正しくアクセスできるようにする修正方法 (コードではなく、サーバー設定でもかまいません) を知っている人はいますか?

再現のためのテストシナリオ

  1. ドメインのすべてのCookieを削除する
  2. ページをロードします (最大 2 回)。2 回の再ロード後には問題は発生しません。
  3. 悪い結果が表示されない場合は、手順を繰り返します。

インデックス

<?php

if (session_status() === PHP_SESSION_NONE) session_start();

if (!isset($_SESSION['userid']))
{
    $_SESSION['userid'] = 3724; //$login['AccountID'];
}

$_SESSION['trialstatus'] = "12";
$_SESSION['trialtcompletions'] = "12";
$_SESSION['userlevel'] = "12";
session_write_close();

print_r($_SESSION);
?>
<!DOCTYPE html><html><head><script src="./js/jquery.min.js"></script>
<script>
    function loadStage(step,input,callback){
        $.ajax({
            type: "POST",
            url: "./ajax.php",
            data: { step: step, input: input },
            dataType: "JSON",
            timeout: 5000,
            success: function(data){
                if(data !== false){
                    callback(data);
                }
            }
        });
    }

    $(document).ready(function(){
        startLoadingSequence();
    });

    function startLoadingSequence(skipped){
        loadStage(1,skipped,function(data){});
    }
</script>
</head></html>

php の

<?php
if (session_status() === PHP_SESSION_NONE) session_start();

print_r($_SESSION);

if (!isset($_SESSION['userid']))
{
    die(json_encode(array(
        "error",
        "You must be logged in to view report data."
    )));
}
?>

リクエストに応じて:

phpinfo

追加情報についてはコメントを読んでください

ベストアンサー1

この問題の原因は 2 つ考えられます。

  1. セッション保存パス (df -h) に十分なスペースがないか、サーバーに保存する権限がありません。
  2. サーバーはロードバランサーの背後にあり、memcache や redis などの永続的なバックエンドにセッ​​ションを保存する必要があります。

おすすめ記事