programing

왜 이 PHP 스크립트(AJAX에 의해 호출됨)가 무작위로 SESSION을 로드하지 않습니까?

lovejava 2023. 9. 16. 08:21

왜 이 PHP 스크립트(AJAX에 의해 호출됨)가 무작위로 SESSION을 로드하지 않습니까?

아호이 스택 오버플로,

제 프로젝트에서 이 문제를 발견했습니다. 간단히 말해서, 제가 수집한 바로는, AJAX를 통해 호출된 PHP 스크립트가 맨 위에 설정된 SESSION 변수를 제대로 등록하지 않고 있다는 것입니다.index.phppage. 처음에는 session locking 때문인줄 알고 가서 추가했습니다.session_write_close(), 하지만 그렇다고 문제가 해결된 것은 아닙니다.

문제는 새 사용자 세션이 시작된 후(즉, 사용자가 로그인할 때)의 약 25%에서만 발생합니다.

저는 버그를 복제하는 데 필요한 최소 코드로 줄이기 위해 코드의 90%를 삭제했습니다.

ajax.php를 통한 Firebug로 인한 잘못된 결과

image

ajax.php를 통한 Firebug의 예상 결과

image2

참고: 두 결과 모두 지수의 수익률을 보여줍니다.print_r($_SESSION)~하듯이Array ( [userid] => 3724 [trialstatus] => 1 [trialtcompletions] => 0 [userlevel] => 5 )인덱스 페이지에 세션이 설정되어 있지 않다는 것을 알 수 있습니다.

AJAX를 통해 호출된 스크립트가 세션 변수에 올바르게 액세스할 수 있도록 하는 수정 사항(코드 단위도 아닐 수도 있고 서버 설정도 있을 수도 있음)을 아는 사람이 있습니까?

재생을 위한 테스트 시나리오

  1. 도메인의 모든 쿠키 삭제
  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
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. 세션 저장 경로(df-h)에 충분한 공간이 없거나 서버에 저장 권한이 없습니다.
  2. 서버가 로드 밸런서 뒤에 있으므로 세션을 멤캐시 또는 redis와 같은 영구 백엔드에 저장해야 합니다.

로드 밸런서를 실행하는 경우 서버가 데이터에 대해 공통 지점에 도달하고 있는지 확인해야 합니다.기본적으로 PHP는 로컬 파일 시스템에 세션을 저장합니다.로드 밸런서가 해당 파일이 존재하지 않는 서버 A에서 서버 B로 전송할 경우 문제가 됩니다.네트워크 공유를 설정하고 모든 웹 서버가 해당 공유를 사용하도록 할 수 있습니다.따라서 NFS 공유를 생성한 다음 session_save_path추가하거나 php.ini 내에서 설정할 수 있습니다.

session_save_path('/your/nfs/share/here');

다른 옵션은 세션을 데이터베이스에 넣는 자신만의 세션 핸들러를 작성하는 것입니다.그런 다음 세션 데이터를 읽을 때마다 DB를 손상시키지 않도록 memcached와 같은 방법으로 세션을 저장할 수 있습니다.

제가 첨부한 스크린샷은 제가 실행한 25-30번의 실행에 거의 동일합니다.[1]: https://i.stack.imgur.com/MgLpS.jpg 세션 데이터 크기가 캐시 크기를 초과하는지 확인합니다.캐시 메모리를 소진하여 다른 세션 데이터를 저장하는 중입니다.캐시 크기를 늘리면 시나리오에 도움이 될 수 있습니다.

언급URL : https://stackoverflow.com/questions/31197111/why-does-this-php-script-called-by-ajax-randomly-not-load-session-correctly