您在這裏遇到的問題實際上與您正在使用sessions(我猜測)有關。這可能有一點延伸,但它會完全說明你描述的內容。
這實際上並不是「預期的行爲」,除非您的Web服務器設置爲使用單個線程運行單個進程,我非常懷疑。這會造成網絡服務器在任何時候只能處理單個請求的情況,這會影響網絡上的每個人。這正是爲什麼你的網絡服務器可能不會像這樣設置 - 事實上我懷疑你會發現這樣配置你的服務器是不可能的,因爲它會使服務器有些無用。在一些聰明的alec和「Node.js怎麼樣?」之前呢? - 這是一個特例,因爲我相信你已經很清楚。
當一個PHP腳本打開一個會話時,它將對會話數據存儲的文件進行排它鎖定。這意味着任何後續請求都會在調用session_start()
時阻塞,而PHP嘗試獲取會話數據文件上的獨佔鎖定 - 它不能這樣做,因爲您之前的請求中仍有一個請求。一旦您的上一個請求完成,它就釋放它對文件的鎖定,並且下一個請求可以完成。由於會話是每臺計算機(實際上按照瀏覽器會話,顧名思義,這就是爲什麼它在不同的瀏覽器中工作的原因),這不會影響您的網絡的其他用戶,但會離開您的網站設置,以便這是一個問題,即使只是對你而言是不好的做法,很容易避免。
解決此問題的方法是在完成給定腳本中的會話數據後立即致電session_write_close()
。這會導致腳本關閉會話文件並釋放它的鎖定。您應該在開始長時間運行過程之前嘗試完成會話數據,或者在完成之前不要致電session_start()
。
從理論上講,你可以打電話session_write_close()
,稍後再在腳本中調用session_start()
,但我發現PHP在這方面有時表現出錯誤行爲(我認爲這是與cookie相關的,但不要引用我的話) 。顯然,請注意設置cookie會修改標題的事實,因此您必須在輸出任何數據或啓用輸出緩衝之前調用session_start()
。
例如,請考慮此腳本:
<?php
session_start();
if (!isset($_SESSION['someval'])) {
$_SESSION['someval'] = 1;
} else {
$_SESSION['someval']++;
}
echo "someval is {$_SESSION['someval']}";
sleep(10);
有了上面的腳本,你將不得不等待10秒,你可以進行第二次請求之前。但是,如果您在echo
行後面添加對session_write_close()
的呼叫,則可以在前一個請求完成之前發出另一個請求。
你能否讓「我聽到矛盾的言論」更清楚一點?你從哪裏聽到的,你爲什麼相信它,你能得到一個信息源? – Nanne