2013-03-10 3 views
3

TL; DR. JS를 먼저 살펴볼 필요가없는 흥미로운 부분 : 저는 세션 카운터를 늘리고 있지만 다른 요청은 같은 값을보고 있습니다. 이 문제는 Chrome에서만 발생합니다. Firefox와 Internet Explorer에서는 모든 요청에 ​​고유 한 값이 표시됩니다.PHP/AJAX 동시 세션이 Chrome에서만 오작동이 발생했습니다

나는 204 HTTP 코드를 얻을 때까지 웹 페이지 (데이터 처리)를 여러 번 시도하고있다. 한 번에 하나의 아약스 호출을 할 수 있습니다. 아약스 자체를 호출하면 성공하고 204에서 멈출 수 있습니다.

내가 더 빨리 수행하기 때문에 모든 작업을 수행 할 수 있습니다. 이것에 의해 여러 개의 동일한 아약스 호출이 만들어지고, 완료 될 때 다른 모든 호출이 시작되어 204 코드에서 멈추는 것을 의미합니다.

내 관련 JS는 다음과 같습니다

$(function() { 
    // "thread" id 
    var counter = 1; 

    // run 3 "threads" 
    generateThreads(3); 

    function generateThreads(num) { 
     if (num <= 0) 
      return; 

     doNextItem(counter++); 

     // Pause before starting the next thread 
     setTimeout(function() { 
       generateThreads(num-1); 
      }, 
      50); 
    } 

    function doNextItem(thread) { 
     $.ajax({ 
      url: URL, 
      statusCode: { 
       200: function(data) { 
        logItem(data, thread); 
        doNextItem(thread); // call itself on the same thread 

       }, 
       204: function(data) { 
        finished(); // done, don't recurse, end the thread 
       } 
      } 
     }); 
    } 
}); 

그리고 PHP에, 내가 세션에 저장된 정수를 증가하고 컷오프 위에있을 때 (204)를 반환하고 있습니다.

if (!isset($_SESSION["nums"])) 
{ 
    $_SESSION["nums"] = 0; 
} 
else if ($_SESSION["nums"] > 10) { 
    http_response_code(204); 
    die(); 
} 
echo json_encode(array("num" => $_SESSION["nums"]++)); 

그런 다음 실행하면 이상한 부분이 있습니다. 자바 스크립트의 logItem()은 스레드 ID를 콘솔에 출력 한 다음 PHP의 번호를 출력합니다.

크롬 :

1: 0 
2: 0 
2: 1 
1: 1 
3: 1 
2: 2 
1: 2 
3: 2 
1: 3 
2: 3 
3: 3 
3: 4 
1: 4 
2: 4 
3: 5 
2: 5 
1: 5 
2: 6 
3: 6 
1: 6 
1: 7 
2: 7 
3: 7 
1: 8 
3: 8 
2: 8 
1: 9 
2: 9 
3: 9 
2: 10 
1: 10 
3: 10 

파이어 폭스/IE

1: 0 
2: 1 
3: 2 
1: 3 
2: 4 
3: 5 
1: 6 
2: 7 
3: 8 
1: 9 
2: 10 
3: 11 
1: 12 
2: 13 
3: 14 
1: 15 
2: 16 
3: 17 
1: 18 
2: 19 
3: 20 

왜 크롬이 나에게 반복 값을주고있다? 정말 비린내

UPDATE

뭔가 각 번호에 대한 중복의 수는 같은 시간에가는 아약스 호출의 수와 정확히 동일한 것입니다. 결코 적게, 결코 더 많이, 그러나 정확하게. 동시에 6 개의 아약스 호출을 실행하면 모두 동일한 금액을 얻습니다. 이것이 타이밍 문제라면, 일관성이 없을 것입니다. 특히 다른 Ajax 호출을 서로 상쇄하기 때문에 그렇습니다. 이것은 javascript 문제라는 것을 나에게 암시한다. 이전에 등장한 php 문제 일 필요는 없다.

큰 게임 CHANGER OF UPDATE 이것은 Chrome에서만 발생하는 문제입니다. Firefox 나 Internet Explorer에서는 발생하지 않습니다. Firefox와 IE에서는 모든 요청이 카운터의 새로운 값을 얻습니다. 분명히 이것은 클라이언트 쪽 문제입니다. 이 정보로 조금 더 연구하면 세션을 죽이는 리다이렉트를하는 무효 요청에 대해 많은 것을 알게됩니다. 특히 favicon.ico의 일반적인 시나리오. 내 모든 요청이 성공하고 favicon.ico도 성공적으로로드됩니다.

+0

이전에 실행 스레드의 끝이 3 개의 스레드가 모두 완료 될 때까지 세션이 아직 설정 또는 수정되지 않았으므로 송신 할 때까지는 발생하지 않습니다. 다른 말로하면, 당신은 단지 같은 일을 assyncronously 3 번하고 있습니다. 변수는 변경되지 않았습니다.setTimeout()에 더 큰 간격을 두십시오. – zgr024

+0

아약스 호출을 너무 빨리 시작한다고 생각합니다. 서버가 $ _SESSION을 업데이트하기 전에 각각 하나가 PHP 페이지를 친다. 또한 자바 스크립트는 단일 스레드이므로 스레드 개념이 인위적으로 보입니다. 현재 어떤 점에서 웹 작업자와 교환하지 않는 한 현재 '스레드'는 동시에 실행되지 않습니다. https://developer.mozilla.org/en-US/docs/DOM/Using_web_workers 또한 코드 예제는 이상합니다 관심사 혼합 : 자바 스크립트에서 값을 쉽게 추적 할 수있을 때 PHP 저장 가치가있는 이유는 무엇입니까? –

+0

@ zgr024 : 웹의 다른 모든 링크는 session_start()가 세션 파일에 대한 액세스를 잠그기 때문에 해당 세션 ID와의 다른 세션 요청이 동시에 발생하지 않는다고 설명합니다. –

답변

5

Chrome은 짧은 시간 내에 동일한 요청을 여러 번 전송하기 때문에 응답을 캐시하고 있습니다. 응답을 캐싱하지 않도록 ajax 호출을 강제하면 문제가 해결됩니다. 이것을 시도하십시오 :

$.ajax({ 
    url: URL, 
    cache: false, 
    statusCode: { 
... 
+0

예. 이것으로 해결했습니다. 정말 고마워요. –

+0

PHP로 세션에 문제가 있습니다. 문제는 다른 사용자의 다른 가치를 반환하는 세션입니다. 이 대답은 나에게 아이디어를 풀어 준다. 그러나 나는이 코드를 사용하지 않고 http://spacebug.com/solving_browser_caching_problem_of_ajax-html/ 지침을 따르고있다. 그러나 다시 당신의 대답은 매우 도움이됩니다. –

관련 문제