同時 AJAX 請求互相阻塞
在某些情況下,AJAX 請求可能不會同時運行,從而導致意外行為。當使用者遇到兩個並發 AJAX 請求的問題時,就會出現此問題,這兩個請求旨在將資料匯出到 XSLX 檔案時顯示進度。第一個請求觸發了一個冗長的 PHP 腳本,第二個請求定期檢查進度更新。
經過調查,發現第二個 AJAX 請求在執行之前等待第一個 AJAX 請求完成。此行為歸因於 PHP 中的會話阻塞。
PHP 中的會話阻塞
預設情況下,PHP 使用檔案來儲存會話資料。當會話啟動時(使用 session_start() 函數),PHP 開啟會話檔案進行寫入並鎖定它以確保獨佔存取。這種鎖定機制可以防止並發請求同時存取檔案。結果,第二個 AJAX 請求必須等待第一個 AJAX 請求完成並解鎖會話檔案才能執行。
解決方案
此問題的解決方案問題是禁用PHP 預設的基於文件的會話存儲,或者在寫入會話文件後明確關閉會話文件,釋放鎖定。
要停用基於文件的會話存儲,請將以下行新增至php.ini file:
session.save_path =
要明確關閉會話文件,請使用session_write_close() 函數:
<code class="php"><?php session_start(); $_SESSION['foo'] = 'bar'; // Write data to the session session_write_close(); // Close the session file echo $_SESSION['foo']; // You can still read from the session. ?></code>
透過實現這些解決方案,您可以確保第二個AJAX 請求將同時執行與第一個一樣,讓您可以毫不拖延地追蹤進度。
以上是為什麼我的 AJAX 請求在 PHP 中會互相阻塞?的詳細內容。更多資訊請關注PHP中文網其他相關文章!