<?php
ob_start();
echo 'test';
ob_end_flush();
flush();
sleep(10);
我嘗試在連接完成之前輸出ajax 請求的回應,但不起作用——它將等待10 秒才能成功獲取回應 在我的例子中是Apache,這是http 伺服器的問題嗎?它它立即回顯響應?
答案1
雖然flush()
,ob_end_flush()
和ob_flush()
應該保證輸出發送到伺服器,但我發現 PHP 有時對特定的軟體配置不太寬容。
特別是在 Windows 上,設定輸出緩衝可能會很痛苦,我發現在系統之間可靠工作的唯一方法是在每次刷新時重置輸出緩衝,如下所示:
<?php
obf_start();
for($i=0;$i<70;$i++) {
echo 'printing... ', microtime(true), '<br />';
if($i % 3 == 2) obf_flush();
usleep(300000);
}
function obf_start() {
ob_start();
}
function obf_flush() {
ob_end_flush();
ob_flush();
flush();
obf_start();
}
這是一個醜陋的解決方案嗎?是的。但直到所有與輸出緩衝相關的錯誤已修復,我認為這種解決方法不會很快在生產程式碼中消失。
另請注意,某些防毒軟體(Panda AV 等)和代理程式將保留所有數據,直到套接字關閉。您無法保證所有用戶端都會收到正確的刷新資料。
答案2
了解是否是伺服器或瀏覽器/庫問題的最簡單方法是即時監控請求。對於您的情況,執行此操作的兩種最簡單的方法是:
- 螢火蟲:此 Firefox 擴充功能將在發送時即時顯示所有 AJAX 請求,並在瀏覽器收到回應後立即顯示回應。
- 流量擷取:使用 Wireshark 等工具即時查看正在傳送的任何類型的請求以及從伺服器傳回的 TCP 流量。
如果您看到資料立即返回,但需要 10 秒才能顯示,則您的瀏覽器或 AJAX 庫正在等待連線關閉,然後再處理回應。如果需要 10 秒才能傳回任何內容,請表示您的伺服器或 PHP 模組故障。