SSE(EventSource):为什么不超过6个连接?

2024-05-10

我想看看在我的机器超载之前我可以设置多少个并发 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 的深入了解。(上交所规范 http://dev.w3.org/html5/eventsource/似乎未定义最大连接数。)


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 会话,并且实际上打开新的 tcp/ip 套接字。由于您在无限循环中不断从服务器推送数据,因此套接字持续保持打开状态。 所有网络浏览器都有上限同时到同一服务器的活动 HTTP/1 连接。根据 RFC 2616,通常在 4 到 6 的范围内。您的浏览器只是阻止打开新连接,因为超出了此限制。

对于 HTTP/2 和 HTTP/3,限制更高(默认情况下为 100 个连接)。

您还可以在这里了解更多信息:
http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/ http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSE(EventSource):为什么不超过6个连接? 的相关文章

  • Selenium Python Firefox webdriver:无法修改配置文件

    我想在 Webdriver Firefox 实例上使用 新选项卡而不是窗口 选项 1 我创建了一个启用此选项的配置文件 但是当我使用该配置文件时 很多选项都可以 但不是这个 2 加载配置文件后 我尝试更改代码中的选项 但它不起作用 我的代码
  • Chrome DevTools:计算样式与 css 规则不同?

    当我在 CSS 文件中定义 4px 时 我的 DOM 元素的 border top width 怎么可能是 0px 当我使用 Chrome DevTools 检查元素时 我发现计算的样式告诉 0px 而最上面的 css 规则是 4px 而且
  • 使用 Apache 在本地网络上托管网站

    我目前在我的机器上使用 Apache 在本地测试 PHP 网站 我只是想知道如何允许连接到本地网络的计算机访问本地计算机上托管的网站 如果仅通过 IP 本地网络上的计算机应该能够访问您的计算机 假设您没有防火墙阻止端口 80 HTTP 完成
  • Apache 从子域重写为 www 但保留所有永久链接

    我已经研究了大约 2 个小时 虽然大多数主题都很相似 但没有一个解释如何做我想做的事情 我正在将一个结构为 blog domain com 的博客移至 www domain com blog 当我重定向时 我需要保留博客文章的永久链接 所以
  • WebGL VS Canvas 2D 硬件加速

    这些天 我需要在画布上画很多图像 画布尺寸为800x600px 我有很多256x256px的图像 有些更小 在上面绘制 这些小图像将在画布上组成一个完整的图像 我有两种方法来实现这一点 首先 如果我使用canvas 2D上下文 那就是con
  • 在服务器上找不到本地主机或 phpMyAdmin:如何修复?

    我按照安装说明进行操作PHP MySQL and PHPMyAdmin 但是当我尝试访问时http localhost phpmyadmin 我收到此错误 未找到 在此找不到请求的 URL phpmyadmin 服务器 然后我尝试访问loc
  • Apache + Symfony2 + HTTPS + Node.js + Socket.io:socket.emit 未触发

    我花了几个小时来解决这个问题 但毫无结果 编辑 找到解决方案 参见我的答案 项目背景 我正在构建一个项目Symfony2 这需要一个用于上传大文件的模块 我选择了Node js and Socket IO 我必须从头开始学习 所以我可能会错
  • 如何从网站网址中隐藏 .html 扩展名

    我知道这个问题以前曾被问过 但有人知道隐藏 html 扩展名的好方法吗 我已经尝试了许多代码和许多答案https stackoverflow com https stackoverflow com 但我没有看到结果 那是我再问你一次 我有一
  • Firefox 不会在使用 jQuery AJAX 加载的内容上呈现 CSS 样式

    我有一个网站 允许用户对书籍和文章发表评论 主表单有一个搜索输入 用于查找相关书籍或文章 来源 我使用 jQuery 根据输入的搜索词从外部站点动态加载新源 然后还使用 AJAX 返回列表中的源 我有两个问题 现在 在用户输入四个字符后 j
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • PHP 拒绝从 var_dump、print 等输出数据

    我目前正在运行 WAMP 服务器 并且在过去的 30 分钟内一直在尝试弄清楚我的项目如何以及为什么不会输出任何指定的 PHP 数据 起初我以为是因为我有一个 htaccess文件的output buffering被禁用 所以我删除了它 仍然
  • SSL 适用于浏览器、wget 和curl,但不适用于 git

    我有一个网站 用于托管 redmine 和几个 git 存储库 这非常适合 http 但我无法使用 https 进行克隆 即 git clone http mysite com git test git 工作正常 但是 git clone
  • 为什么 Tomcat 缺少内置的速率限制过滤器?

    从几个来源 1 https serverfault com questions 177742 2 http tomcat 10 x6 nabble com tomcat bandwidth limiter transfer rate lim
  • 如何在XAMPP服务器中实现类似路由器登录的用户认证?

    我正在尝试在我的 XAMPP 服务器中设置用户身份验证 类似于路由器在调用特定路由时提示输入用户名和密码的方式 我想了解底层协议以及浏览器如何识别服务器需要身份验证 谁能指导我完成在 XAMPP 中创建此身份验证协议的过程 我希望能够解释所
  • 控制台未打开时无法加载资源:net::ERR_EMPTY_RESPONSE

    我正进入 状态 Failed to load resource net ERR EMPTY RESPONSE 如果控制台未打开 我的 api 调用会出错 然而如果控制台打开 则 api 调用工作正常 前端使用 Angular2 后端使用 N
  • 最小高度:自动在 Opera 中不起作用

    我注意到min height不在 Opera 中工作 我正在尝试这样的事情 div class content div div class content newstyle div 我的 CSS 代码是 content min height
  • Windows 8.1 升级后 Apache 无法工作 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天从 Windows 8 升级到 Windows 8 1 后 Apache 不再工作 我上次从 Windows 7 升级到 Window
  • DOM 元素宽度可以是非整数吗?

    我有一个页面 其 div 元素由 JavaScript 对齐 JavaScript 只是检查一组 div 元素来查找最大值偏移宽度 然后设置所有 div 元素 width成为最大偏移宽度 它在大多数浏览器和区域设置中都能完美运行 但在 Ma
  • CNAME 速度慢吗?

    我将 CNAME 与 S3 CloudFront 一起使用来提供一些静态文件 例如 js css 图像等 我这样做是为了使存储桶的 URL 更漂亮 因为我认为最好将所有内容都定位到我的网站 以防万一将来我想移动这些文件 更改应该是透明的 今
  • 网站可以检测您何时将 Selenium 与 chromedriver 结合使用吗?

    我一直在使用 Chromedriver 测试 Selenium 我注意到有些页面可以检测到您正在使用 Selenium 即使根本没有自动化 即使我只是通过 Selenium 使用 Chrome 手动浏览 Xephyr https en wi

随机推荐

  • 选项卡容器 - 事件未触发

    i am creating a tab container at runtime and make 1 of the column member as the tab header once user click on the tab i
  • LINQ FirstOrDefault 与Where(...).FirstOrDefault 之间的区别?

    之间有什么区别 FirstOrDefault someField gt someField Name Equals settings Text and Where someField gt someField Name Equals set
  • 有什么方法可以查看按文件夹层次结构组织的 VSCode“在文件中查找”结果吗?

    我来自 Eclipse 其中使用 h 跨文件搜索字符串会按找到结果的文件夹组织结果 如下所示 搜索结果 https i stack imgur com 8Cg5A png 这非常方便 因为可以折叠和展开文件夹以缩小结果范围 vscode 是
  • 为什么可以从 console.log 访问 JavaScript 私有方法

    我写了一个简单的代码 const secure new class privateProperty 4 privateMethod console log The property this privateProperty should n
  • 登录方式使用GINA定制

    我知道在 GINA 中找到大师并不容易 但我的问题最接近进程间通信 IPC 我用非托管 c 编写了我的自定义 GINA 我在其中包含了一个方法来检查用户尝试的指纹的有效性为了登录 该函数将调用正在运行的系统Windows服务中用C 编写的一
  • 使用 jquery 迭代 json 数组

    已经有一些帖子和我遇到了类似的问题 如何使用 PHP 中的 jQuery AJAX 调用迭代 JSON 数组 https stackoverflow com questions 6472338 how do i iterate over a
  • 没有函数或 json 的 JavaScript 大括号

    刚刚打开客户端的 javascript 文件 第一行是这样的 var s account blog 我不明白 通常 根据我的经验 花括号包裹着一个函数 function welcome or a json JavaScript object
  • 允许 Kubernetes 用户列表/获取命名空间

    我有以下用户清单 我希望允许 myapp user 获取集群内所有命名空间的列表 根据我的查找 我应该创建一个 ClusterRole 但我无法真正找到足够的详细信息 是否有所有 apiGroup 以及相应资源和动词的列表 apiVersi
  • 自动安排并执行 PHP 脚本

    我编写了一个 PHP 脚本 它生成一个包含数据库中所有表的 SQL 文件 我想要做的是每天或每 n 天执行这个脚本 我读过有关 cron 作业的内容 但我使用的是 Windows 如何在服务器上自动执行脚本 您需要添加计划任务来调用 URL
  • 如何从特定索引渲染 v-for

    我想在 v for 中循环假设从数字 5 到 10 循环希望在 5 点开始并在 10 点结束 我试过这个 div div 但我想要更有效的循环方式 有谁知道如何让循环从 5 开始 对于你的例子来说是可能的 div some code her
  • 如何使用ffmpeg重叠和合并多个音频文件?

    我正在尝试将多个音频文件合并到一个文件中 但我可以使用以下命令来连接 而不是连接 ffmpeg v debug i file1 wav i file2 wav i file3 wav filter complex 0 0 concat n
  • 使用多个构造函数创建不可变类

    我正在阅读这一页 https docs oracle com javase tutorial essential concurrency imstrat html关于在 Java 中创建不可变类 并决定根据页面上概述的规范修改我正在编写的类
  • 从剪贴板获取文本后将一个字符串插入另一个字符串所需的建议

    简介及相关信息 我有一个edit control只需要接受带符号的十进制数 类似于 12 35 我决定通过以下方式实现这一点subclassing The WM CHAR处理程序似乎运行良好 我需要处理其他几条消息以完全保护用户免于输入无效
  • MVC 6 控制器中的 ControllerContext 和 ViewEngines 属性在哪里?

    我创建了一个新的 MVC6 项目并构建了一个新站点 目标是获得视图的渲染结果 我找到了以下代码 但我无法让它工作 因为我找不到ControllerContext和ViewEngines 这是我要重写的代码 protected string
  • 如何通过 eBay API 获取 PayPal TransactionID

    我需要通过 API 获取 eBay 上已付款订单的 PayPal TransactionID 我使用外部事务 如下所述 https ebay custhelp com app answers detail a id 1550 linking
  • 正确地将 flash.utils.Dictionary 序列化为 SharedObject

    我的 Flex 项目中有一个名为 HashMap 的便利集合类 它本质上是 flash utils Dictionary 的包装器 带有一堆便利方法和添加的 同步的 ArrayCollection 以便我可以将 HashMap 传递给需要的
  • Lua 将字符串转换为数字 - 取决于语言环境

    刚刚注意到字符串 and tonumber 在 Lua 中是依赖于语言环境的 知道如何在不使用的情况下将字符串转换为数字tonumber 谢谢 例如将字符串 58 5 转换为 58 5 另外 当我尝试将带点的数字传递给函数时 该函数会转换
  • git rebase -i ——为什么它改变提交哈希值?

    所以我或多或少熟悉变基的工作原理 但直到最近我通常只做了一个git rebase i HEAD 20 并修改了需要修改的内容 我很惊讶地发现这将修改所有 20 个提交的哈希值 即使我采取的唯一操作是压缩最后两个提交 我不确定是什么导致其他
  • AudioKit - 立体声通道从输入翻转到输出?

    我正在使用 AudioKit 创建一个实验性 iOS 音频应用程序 目前 我正在尝试将 AKStereoInput 的左声道重新路由到 AudioKit output 的右声道 并将 AKStereoInput 的右声道重新路由到输出的左声
  • SSE(EventSource):为什么不超过6个连接?

    我想看看在我的机器超载之前我可以设置多少个并发 SSE 又名 EventSource 连接 但使用 Firefox Firefox 18 或 Firefox 20 进行测试时 它在 6 个连接处停止 附加连接没有给出错误 但不发送任何数据