我正在编写一个应用程序,在<head>
部分包含大约12个简短的JS文件(我知道,我应该合并它们并在<body>
结束之前将它们移动到生产中)
麻烦的是,当我尝试在Chrome中加载应用程序时, 一些文件立即加载,而一些永远不会完成加载! Chrome一直试图加载12个JS文件,并且在我点击“停止”之前从不呈现页面。
当我停下来,HTML呈现和JS文件失败,如下图所示:
请注意,不同的JS文件在每个尝试失败! 这不是每次都卡住的文件!
检查失败文件的标题显示“小心:请求尚未完成”。 这些文件有时会在“接收”中停留很多分钟!
现在这里是有趣的部分,在停止后,如果我专注于omnibar并按回车,所有的JS文件加载即时和应用程序工作正常!
在服务器端,我使用Apache,PHP和MySQL。 我在Apache中configuration了什么?
经过2天艰苦的日子后的状态 :zilch,没有,nada,这使我疯狂。 我试图从不同的机器上运行代码,试图改变Apache的caching设置,并改变了无数的东西在JavaScript中,但没有任何工作。 最糟糕的是,没有人可以指出问题所在!
一种可能性是你已经启用了Keep-Alive并且不能正常工作。 我以前见过这个。 浏览器建立连接到服务器的最大数量(通常是6)下载前几个文件(CSS,JS等),然后这些连接不会被释放,直到超时。 我的症状与您的症状不太一样 – 超时时间为20秒,之后所有数据将分批加载,但这仍然是原因。
在您的Apache配置(大多数系统上的httpd.conf)中,查找KeepAlive
行(如果缺失则添加它)并将其设置为Off
。
不只是一个答案,这是我将如何解决问题。
我想尝试的一件事是每次注释一个标签并重新加载,以查看阈值在哪里。 另外,因为这可能是一个服务器配置问题,所以每次尝试之后,我都会重新启动它,以便拥有一个干净的版本,也就是说,在尝试之间不保留任何状态。
我试图得到更多的提示,试图从您最喜欢的语言脚本的各种JavaScript的请求。 理想情况下,我会尝试一个接一个的(使用curl说)等待几个毫秒的请求之间的脚本。 我想我也会在这里达到一个门槛。 就像每秒获得一个脚本一样,但是当请求太靠近时,服务器就会卡住。
如果还没有线索,我会使用tcpdump来观看浏览器和服务器之间的流量。 好吧,这可能有点太低级!
但也许我会使用netstat来查看浏览器打开多少个连接并行到服务器来获取资源,看看我们是否达到并发限制。
我很抱歉,这是一个解决方案,但我希望你有一些想法,我很想知道你的问题是什么,最后!
检查内容长度标题。 服务器可能传递不正确的值 – 比实际的内容长度更大。
在浏览器中发出请求之后,我们得到了完全相同的消息“请注意:请求尚未完成”。
请求本身的大小是15MB的JSON,它被加入到Angular 1应用程序中。 这个请求花了大约2秒钟。 在请求完成之后,Angular digest循环将浏览器阻塞超过12秒(在请求期间通过分析可以看到)。 在此期间,Chrome浏览器显示“请注意:请求尚未完成”消息,但实际上已经完成。
有几个很好的答案,但如果你想要一个这样做的万无一失的方法,你可以使用PHP一次发送所有的脚本。 如果问题真的是太多连接到服务器,你可以添加一些这样的HTML代码:
<script type="text/javascript" src="scripts/scripts.php />
然后在scripts.php
使用include()
函数来包含所有JavaScript文件,如下所示:
<?php header(''); // control all your headers include('jquery-1.9.1.min.js'); // rest of scripts ?>
如果没有其他的工作,问题是过度的连接,这应该工作。