2013-05-30 4 views
0

두 개의 동일한 PHP 요청이 동시에 실행되는 것을 막는 것으로 보입니다. 이것이 내 브라우저, Apache 또는 PHP인지 확실하지 않습니다. Firefox와 Chrome에서 모두 테스트했습니다 (비교적 최근 버전). 아파치/2.2.22 (apache2-mpm-prefork)와 PHP 5.4.9-4ubuntu2 (libapache2-mod-php5) 사용하기.PHP (또는 아파치)가 비동기 요청을 방지합니다

처음에는이 문제가 세션과 관련되어 있다고 가정하고 세션 자동 시작을 사용하지 않고 있음에도 불구하고 session_write_close()을 호출하지 않았습니다. 또한 Chrome의 개발자 도구를 사용하고/var/lib/php5를 체크인했으며 생성되는 세션과 관련이 없습니다.

나는이 문제로 오후 내내 머리를 긁적이고 있으며 관련 질문을 찾을 수 없습니다.

나는 하나의 PHP 스크립트 (아래)이 재현 할 수 있는지 알려, 및/또는 설명하십시오에 내 테스트 케이스를 단순화

:

<?php 
if (isset($_GET['frame'])) { 
    echo 'Hello world at '. time(). '<br>URI: '. $_SERVER['REQUEST_URI']; 
    sleep(2); 
    exit; 
} 
?><!DOCTYPE html> 
<html> 
<body> 
<div style="background-color: #eee;"> 
    <p>If the two times below are different by around 2 seconds (or more), stuff is broken (or not working as I expected).</p> 
    <iframe src="<?=$_SERVER['REQUEST_URI'];?>?frame"></iframe> 
    <iframe src="<?=$_SERVER['REQUEST_URI'];?>?frame"></iframe> 
</div> 
<hr> 
<div style="background-color: #eee;"> 
    <p>The two iframes below are doing the same thing as the two iframes above, except they have an additional query string parameter, this seems to prevent the scripts from blocking.</p> 
    <iframe src="<?=$_SERVER['REQUEST_URI'];?>?frame&amp;1"></iframe> 
    <iframe src="<?=$_SERVER['REQUEST_URI'];?>?frame&amp;2"></iframe> 
</div> 
</body> 
</html> 

건배, 데이비드

을 편집 :이 PHP 관련 있다고 생각하지 않습니다, 나는 너무 CGI 스크립트를 사용하여이 문제를 재현하기 위해 관리했습니다.

답변

0

여러분의 문제는 HTTP와 브라우저가 캐싱을 처리하는 방식의 결과라고 생각합니다. 브라우저는 두 iframe 모두에 대해 결과를 사용할 수 있다고 가정하고 단일 요청을 전송합니다. 그러나 PHP는 기본적으로 Cache-Control : no-cache를 보내고 HTTP 헤더를 반드시 재 검증해야합니다. 브라우저가이 헤더를 볼 때 두 번째 iframe에 대한 다른 요청을 보냅니다. 브라우저가 URL이 다르므로 두 개의 요청을 즉시 전송하기 때문에 두 번째 iframe 집합이 예상대로 작동하는 것입니다.

관련 문제