2013-05-30 57 views
0

看來有些東西阻止了兩個相同的PHP請求併發執行。我不確定這是我的瀏覽器,Apache還是PHP。 我已經在Firefox和Chrome(相對較新的版本)中進行過測試。使用Apache/2.2.22(apache2-mpm-prefork)和PHP 5.4.9-4ubuntu2(libapache2-mod-php5)。PHP(或apache)正在阻止異步請求

我第一次假設這個問題會與會話有關,並且試圖調用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的請求。這就是第二組iframe按照您的預期工作的原因,因爲瀏覽器會立即發送兩個請求,因爲這些URL是不同的。