天天看點

php無法立即完成一個非阻止性套接字操作,PHP逾時會阻止人們在同一網絡上加載頁面嗎?...

您在這裡遇到的問題實際上與您正在使用sessions(我猜是這樣)有關.這可能有點麻煩,但這将完全解釋您的描述.

除非您将Web伺服器設定為運作具有單個線程的單個程序,否則這實際上不是“預期的行為”,我對此表示高度懷疑.這将導緻Web伺服器在任何時候隻能處理一個請求的情況,并且會影響網絡上的每個人.這就是為什麼您的Web伺服器可能不會這樣設定的原因-實際上,我懷疑您會發現無法像這樣配置您的伺服器,因為這會使伺服器有些用處.在一些聰明的alec提出“ Node.js到底是什麼?”之前, -這是特例,因為我相信您已經很清楚了.

當PHP腳本打開會話時,它将在存儲會話資料的檔案上具有排他鎖.這意味着,任何後續請求都将在對session_start()的調用時阻塞,而PHP嘗試擷取會話資料檔案上的排他鎖-不能,因為您先前的請求仍然有一個.您上一個請求完成後,它将釋放對檔案的鎖定,并且下一個請求可以完成.由于會話是按計算機進行的(顧名思義,實際上是按浏覽的會話,這就是為什麼它在不同的浏覽器中工作的原因),是以這不會影響您網絡的其他使用者,但是會設定您的站點,是以這是一個即使是僅針對您的問題也是不好的做法,很容易避免.

解決方案是在給定腳本中使用完會話資料後立即調用session_write_close().這将導緻腳本關閉會話檔案并釋放其鎖定.您應該嘗試在開始長時間運作的過程之前完成會話資料的處理,或者直到完成後才調用session_start().

從理論上講,您可以在腳本中調用session_write_close()然後再調用session_start(),但是我發現PHP有時在這方面表現出錯誤的行為(我認為這與Cookie相關,但請不要在此引用我) .顯然,請注意設定cookie會修改标頭的事實,是以您必須在輸出任何資料或啟用輸出緩沖之前調用session_start().

例如,考慮以下腳本:

session_start();

if (!isset($_SESSION['someval'])) {

$_SESSION['someval'] = 1;

} else {

$_SESSION['someval']++;

}

echo "someval is {$_SESSION['someval']}";

sleep(10);

使用上述腳本,您将需要等待10秒鐘才能發出第二個請求.但是,如果在回顯行之後添加對session_write_close()的調用,則可以在前一個請求完成之前發出另一個請求.