gpt4 book ai didi

apache - SSE(事件源): why no more than 6 connections?

转载 作者:行者123 更新时间:2023-12-04 00:54:41 25 4
gpt4 key购买 nike

在我的机器重载之前,我想看看我可以设置多少个同步 SSE(又名 EventSource)连接。但是使用 Firefox(Firefox 18 或 Firefox 20)进行测试时,它在 6 个连接处停止:附加连接没有错误,但不发送任何数据。 (在 Firebug 中,我可以在那里看到它们,等待连接。)
Chromium 25 也停止在 6 个连接处,Opera 12.15 也是如此。
但这似乎不是服务器端限制(我使用的是 Apache + PHP),因为我可以同时运行所有三个浏览器(即 18 个连接),并且都来自同一个 IP 地址。
(服务器和客户端在同一台机器上,但使用 172.16.x.x 地址,而不是 127.0.0.1。)

因此,我使用 CORS 设置了测试,并尝试连接到另一台具有全局 IP 的服务器。这次我获得了 12 个 Firefox 连接。暗示它毕竟是Apache配置?不,Opera 仍然只能获得 6 个连接。 (Chrome 没有数字,因为 CORS 似乎不起作用。)我还可以连接到两台服务器,在 Firefox 中总共有 18 个连接(但不会再有),在 Opera 中总共有 12 个连接。

作为第三个测试,我将后端和 html 都移到了远程服务器,并以这种方式加载了页面。这次我达到了 Firefox 10 个连接的限制!?! Opera 仍然有 6 的限制。而 Chromium(由于这次没有涉及 CORS 可以工作)有 6 的限制。

我很感激您对这个数字 6 的来源有任何了解,如果这三个浏览器都相同是否只是巧合。尤其是关于为什么 Firefox 有时是 6,有时是 10,有时是 12 的任何见解。(SSE specification 似乎未定义最大连接数。)

Apache配置是使用prefork,意思是这些设置:

StartServers          5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0

(本地(Ubuntu 10.04)和全局(Ubuntu 11.10)服务器在此处具有相同的 Apache 设置。)
我相信那里的关键数字是 MaxClients 是 150。我做了一个快速实验,将 StartServers 更改为 50,而不是 5,但得到了相同的结果。

这是客户端的 HTML/javascript(如果您想尝试连接到不同的服务器,则需要 1 或 2 行取消注释和修改;如此处所示,它希望在与 HTML 相同的目录中找到 sse.php):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>SSE Stresstest</title>
</head>
<body>
<p id="err"></p>
<p id="x"></p>
<script>
function start(){

function onMessage(e){
document.getElementById('x').innerHTML+=e.origin+":"+this.dummy_n+":"+e.data+"<br/>";
};

function onError(e){
document.getElementById('err').innerHTML+="ERR:"+this.dummy_n+":"+JSON.stringify(e)+"<br/>";
};

for(var n=1;n<=32;++n){
//NB. 't' primarily to avoid caching
var url='sse.php?dummy_n='+n+'&t='+(new Date().getTime());
//if(n%2==0)
// url='http://example.com/sse.php?dummy_n='+n+'&t='+(new Date().getTime());
var es=new EventSource(url);
es.dummy_n=n; //So we can identify each one
es.addEventListener('error',onError,false);
es.addEventListener('message',onMessage,false);
}
}

setTimeout("start()",1000); //Only Safari needs the 1000ms delay.
</script>
</body>
</html>

而后端 sse.php 脚本是这样的:
<?php
$ip=array_key_exists('SERVER_ADDR',$_SERVER)?$_SERVER['SERVER_ADDR']:'cli';
header('Content-Type: text/event-stream');
header('Access-Control-Allow-Origin: *'); //CORS: allow access from anywhere
@ob_flush();@flush();
//Now the main loop
while(true){
echo "data:".gmdate("Y-m-d H:i:s,").$ip."\n\n";
@ob_flush();@flush();
sleep(1);
}
?>

最佳答案

原因可能是每个 EventSource 对象都启动了新的 HTTP session ,实际上打开了新的 tcp/ip 套接字。由于您在无限循环中不断地从服务器推送数据,因此套接字始终保持打开状态。
所有 Web 浏览器对到同一服务器的同时事件 HTTP/1 连接都有上限。根据 RFC 2616,通常在 4 到 6 的范围内。由于超出此限制,您的浏览器只会阻止打开新连接。
对于 HTTP/2 和 HTTP/3,限制更高(默认为 100 个连接)。
您也可以在这里了解更多信息:
http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/

关于apache - SSE(事件源): why no more than 6 connections?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16852690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com