我正在處理一個需要無盡ajax請求的項目。有數據要發送時,服務器停止請求。同時連接到apache/php
爲了簡化測試,我做了一個樣本模擬問題:
<?php
// Close (and disable) session to avoid lock
session_start();
session_write_close();
echo '<pre>';
do {
echo time() . "\n"; ob_flush(); flush();
error_log($_GET['id'] . ' - ' . time());
usleep(2000000); // sleep 2s to unload the CPU
} while (1);
在Chrome,加載該頁面將顯示每兩秒新的時間戳。在Firefox上,什麼都不會顯示,那爲什麼我把error_log
。
如果我打開腳本6次,一切正常。但如果我再打開一次,新選項卡將不顯示任何內容,並等待一個進程停止。使用私人模式或其他瀏覽器,我可以調用腳本6 *次。
似乎Apache或PHP限制爲每個客戶端/會話6個連接。任何想法?
編輯:
看來,那是瀏覽器的限制:https://stackoverflow.com/a/985704/3036602 任何人都知道如何避免這種限制?
編輯2: 在網上搜索後,我發現我不是唯一有這個問題的人。我沒有找到任何簡單的解決方案。我找到了兩個: - Facebook方法:每個標籤使用不同的子域。此解決方案要求具有特定的Web服務器和DNS。 - 本地存儲:只有一個標籤允許發出請求。這個解決方案並不是那麼糟糕,但需要一些工作 - 本地存儲:禁止多個標籤(最簡單的解決方案,但不是真正的性感)
「我正在開發一個需要不斷髮出Ajax請求的項目。當有數據要發送時,請求被服務器停止。「那麼你想創建一個拒絕服務腳本? – JakeGould
看看[這個問題](http://stackoverflow.com/questions/11185618/whats-the-maximum-number-of-simultaneous-connections-a-browser-will-make)。這在某些MS IIS服務器上也不起作用,因爲'flush()'在這些服務器上不起作用 – Michel
個人而言,'do ... while'應該是通過來自客戶端的Ajax請求調用的單個請求,而不是沒有結束的服務器端循環。它應該從客戶端(瀏覽器)循環。 – Tigger