簡體   English   中英

同時連接到apache / php

[英]Simultaneous connection to apache/php

我正在一個需要無休止的ajax請求的項目中。 有數據要發送時,服務器將停止請求。

為了簡化測試,我制作了一個樣本來模擬問題:

<?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。 -本地存儲:僅允許一個選項卡發出請求。 這個解決方案還不錯,但是需要一些工作-本地存儲:禁止使用多個標簽(最簡單的解決方案,但並不是很性感)

我終於找到了解決方案。

瀏覽器不允許同時與一個域建立太多連接。 對於Firefox和Chrome,限制為6。

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

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

允許來自其他域的請求。

最后,在您的JS應用程序中,您需要創建一個隨機子域(Math.random)並將其用於所有Ajax調用中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM