Ajax異步請求PHP服務器,如何做到無阻塞響應

最近發現了一個ajax異步請求的問題,用$.post、$.get、$.ajax請求PHP服務器時,總是無法異步返回數據。


經多次測試才發現:
-- 不同瀏覽器,請求不同域名-不阻塞:無需實驗
-- 不同瀏覽器,請求同域名-不阻塞:session_id()返回不同
-- 同一瀏覽器,請求不同域名-不阻塞:session_id返回不同
-- 同一瀏覽器,請求同域名-阻塞:session_id()返回相同
發現問題所在:
1 關閉XDEBUG
2 SESSION鎖
3 清除輸出緩衝區
1 關閉XDEBUG
XDEBUG是實時調試。調試時,它將保持FPM以確保線程正在工作以避免數據汙染。
典型的測試方法是,使用XDEBUG進行調試時,打開另一個瀏覽器並訪問該站點,該站點這個時候是無法訪問的。
這對並行響應有重大影響,即,即使前端發送多個請求,它也受XDEBUG控制,並且只能同時響應一個。
另外,由於XDEBUG依賴於SESSION,因此即使您使用session_write_close(),也要關閉會話鎖(請參見下文)。
XDEBUG仍會自動打開。
2 SESSION鎖

用 session_write_close() 關閉SESSION的寫鎖,這適合SESSION保存為File的情況。
如果SESSION保存在Redis,則不需要。
3 清除輸出緩衝區
使用session_write_close()可能無法立即關閉SESSION鎖,所以在這個方法之前加上:ob_end_flush()。
讓 session_write_close() 馬上生效。

4 示例
有如下一個範例,當點擊【提交】按鈕時,前端會給後臺服務器發送兩種請求。
一種是get請求,每隔1秒請求一次。
一種是post請求,最開始的時候發送一次,然後等待相應結束。
看看HTML代碼

<code><script>/<code>


php代碼

<code> $_SESSION['time']]);    exit();}if ($action == 'get') {    echo json_encode([session_id() => $_SESSION['time']]);    exit();}/<code> 


擴展鏈接:MySQL面試題詳解,獻給面試道路上的你

Ajax異步請求PHP服務器,如何做到無阻塞響應


分享到:


相關文章: