2014-01-05 71 views
0

我正在處理一個需要無盡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。 - 本地存儲:只有一個標籤允許發出請求。這個解決方案並不是那麼糟糕,但需要一些工作 - 本地存儲:禁止多個標籤(最簡單的解決方案,但不是真正的性感)

+0

「我正在開發一個需要不斷髮出Ajax請求的項目。當有數據要發送時,請求被服務器停止。「那麼你想創建一個拒絕服務腳本? – JakeGould

+0

看看[這個問題](http://stackoverflow.com/questions/11185618/whats-the-maximum-number-of-simultaneous-connections-a-browser-will-make)。這在某些MS IIS服務器上也不起作用,因爲'flush()'在這些服務器上不起作用 – Michel

+0

個人而言,'do ... while'應該是通過來自客戶端的Ajax請求調用的單個請求,而不是沒有結束的服務器端循環。它應該從客戶端(瀏覽器)循環。 – Tigger

回答

1

我終於找到了解決方案。

瀏覽器不允許同時連接到域的太多連接。對於Firefox和Chrome,極限爲6.

解決方案之一,就是使用子域。爲此,您需要在DNS上添加* .mydomain.tld條目。 在您需要添加的PHP腳本中,您需要添加

header('Access-Control-Allow-Origin: *'); 

以允許來自其他域的請求。最後,在你的JS應用程序中,你需要創建一個隨機的子域(Math.random)並在你所有的Ajax調用中使用它。