我有一个 php 网站。由于我使用的是模板引擎并且我总是在“一次性”中执行 html,因此我预先设置了 html 文档的大小。所以我决定设置 Content-Length 标头以获得更好的性能。如果我没有设置它,则使用分块编码传输文档。
html 输出的 php 代码如下所示:
header('Accept-Ranges: none');
header('Content-Length: '.strlen($content));
echo $content;
我在 Chrome、IE、Firefox 和 Safari 的 windows 下对其进行了测试——它可以工作文件。但是微软必应机器人(使用必应网站管理员工具)表示该网站没有响应。我决定进行调查,这就是我发现的:
- wget 在 CentOS 5.x 和 CentOS 6.x 上运行良好
- CentOS 6.x 上的 elinks 工作正常
- CentOS 5.x 上的 elinks停顿(版本 elinks-0.11.1-6.el5_4.1)
因此,Centos 5 上的 elinks 是我发现的唯一一个在访问该站点时遇到问题的 http 客户端。但是我不知道如何从中获取调试信息。
问题:
- 有人可以告诉我如何从 elinks 中获取调试信息。是否有可能拥有 http+headers 的原始副本?或某种错误日志
- 知道为什么停顿发生在一个客户身上而没有发生在另一个客户身上吗?
- 嗯,很可能是导致问题的不正确的标题“Content-Length”,因为当我删除它时,它在 elinks 和 Bing 中工作正常。什么可能导致内容长度差异
- 还有其他要测试的http客户端吗?
所有测试都在同一个 Web 服务器、相同的 php 版本、相同的网页和相同的内容上完成。我能想到的是 UTF-8 文本文件标识符(一些浏览器放置的文本文件前面的几个字节)
这是带有 wget 的标头转储:
wget dev.site.com/ --server-response -O /dev/null
--2013-11-09 01:32:37-- http://dev.site.com/
Resolving dev.site.com... 127.0.0.1
Connecting to dev.site.com|127.0.0.1|:80... connected.
HTTP request sent, awaiting response...
HTTP/1.1 200 OK
Date: Fri, 08 Nov 2013 23:32:37 GMT
Server: Apache
Set-Cookie: lng=en; expires=Wed, 07-May-2014 23:32:37 GMT; path=/; domain=dev.site.com
Last-Modified: Fri, 08 Nov 2013 23:32:37 GMT
Cache-Control: must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Expires: 0
Set-Cookie: PHPSESSID=8a1e9b871474b882e1eef4ca0dfea0fc; expires=Thu, 06-Feb-2014 23:32:37 GMT; path=/
Content-Language: en
Set-Cookie: hc=1518952; expires=Mon, 17-Nov-2036 00:38:00 GMT; path=/; domain=dev.site.com
Accept-Ranges: none
Content-Length: 16970
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Length: 16970 (17K) [text/html]
Saving to: “/dev/null”
100%[===================================================================================================================================================================================================>] 16,970 --.-K/s in 0.1s
2013-11-09 01:32:37 (152 KB/s) - “/dev/null” saved [16970/16970]
更新:
我能够重现该问题,但仅在生产服务器上。我注意到工作和非工作 elink 之间的一个区别是非工作发送此标头:Accept-Encoding: gzip
当然,如果它是 gzip 压缩的,大小会有所不同。zlib.output_compression 在 php.ini 上打开。我想这可能是问题所在。输出缓冲也是 4096。这很奇怪,因为大多数浏览器在可用时都使用压缩。我会在网络浏览器中再试一次。
是的,浏览器(chrome)也要求压缩,并且 gzip 存在于响应标头中:
Content-Length: 15916
Content-Encoding: gzip
查看源代码显示正好 15916 字节。Chrome 可以选择显示原始标题以及解析。可能发生的情况是 Chrome 在计数之前实际上会解压缩数据。听起来很奇怪,但这是 GUI Web 浏览器工作而一些较低级别的客户端不能工作的唯一解释