Dar*_*ook 11 apache firefox opera google-chrome server-sent-events
在重载我的机器之前,我想看看我可以设置多少同步SSE(也称为EventSource)连接.但是使用Firefox(Firefox 18或Firefox 20)测试它在6个连接处停止:附加连接没有错误,但不发送任何数据.(在Firebug中,我可以在那里看到它们,等待连接.)Chromium 25也在6个连接处停止,Opera 12.15也是如此.但它似乎不是服务器端限制(我使用Apache + PHP),因为我可以同时运行所有三个浏览器(即18个连接),并且所有都来自相同的IP地址.(服务器和客户端位于同一台计算机上,但使用的是172.16.xx地址,而不是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规范似乎未定义最大连接数.)
Apache配置是使用prefork,这意味着这些设置:
StartServers 5
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 0
Run Code Online (Sandbox Code Playgroud)
(本地(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>
Run Code Online (Sandbox Code Playgroud)
而后端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);
}
?>
Run Code Online (Sandbox Code Playgroud)
esb*_*ych 13
原因可能是每个EventSource对象都启动新的HTTP会话,实际上会打开新的tcp/ip套接字.由于您在无限循环中持续从服务器推送数据,因此套接字会持续打开.所有Web浏览器都有同一活动连接到同一服务器的上限.根据RFC 2616,通常在4到6的范围内.您的浏览器只是阻止新连接打开,因为要超出此限制.
您可以在这里了解更多信息:http:
//www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/
| 归档时间: |
|
| 查看次数: |
7702 次 |
| 最近记录: |