背景:我经营一家订阅式扑克策略视频网站。我们的视频长度从 30 分钟到 80 分钟不等,大小从 20MB 到 500MB 不等。该网站与 hostmonster.com 共享服务器
我的一位用户在下载一些较大的视频文件时遇到了问题。他报告说,任何超过 100MB 的文件都会出现问题。基本上,他只能下载文件的一部分,这意味着视频在结束前就停止了。他尝试了多个地点的多台电脑。他报告说,他能够从其他网站成功下载 500MB 的文件。
他使用 Internet Explorer(版本未知)作为浏览器。我建议他尝试 Firefox 或 Chrome,看看它们的下载管理器是否对他有用,但到目前为止我还没有收到任何回复。
他还报告说他的下载没有报告任何文件大小。我也看到了同样的情况(没有报告文件大小),但我没有遇到下载本身的任何问题。
我们通过 php 脚本传递下载,该脚本会验证登录信息并将下载记录到我们的数据库,然后返回文件。我怀疑这就是为什么没有报告文件大小的原因。
我还应该问用户什么?他或我还可以尝试什么?
答案1
当我开始更改服务器配置设置时,问题终于得到了解决,这是根据 StackOverflow 问题 (https://stackoverflow.com/questions/2617190/php-file-serving-script-unreliable-downloads)
进一步研究文件大小问题后,我发现脚本中的大小设置正确,但这并未反映在返回给浏览器的标头中。相反,返回的标头如下:
http://www.grinderschool.com/download_video_test.php?t=KillsAids021&format=wmv
GET /download_video_test.php?t=KillsAids021&format=wmv HTTP/1.1
Host: www.grinderschool.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Cookie: style_cookie=printonly; phpbb3_7c544_u=2; phpbb3_7c544_k=44b832912e5f887d; phpbb3_7c544_sid=e8852df42e08cc1b2250300c2897f78f; __utma=174624884.2719561324781918700.1251850714.1270986325.1270989003.575; __utmz=174624884.1264524375.411.12.utmcsr=google|utmccn=(organic)|utmcmd=organic|utmctr=low%20stakes%20poker%20videos; phpbb3_cmviy_k=; phpbb3_cmviy_u=2; phpbb3_cmviy_sid=d8df5c0943863004ca40ef9c392d371d; __utmb=174624884.4.10.1270989003; __utmc=174624884
HTTP/1.1 200 OK
Date: Sun, 11 Apr 2010 12:58:02 GMT
Server: Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635
X-Powered-By: PHP/5.2.11
Content-Disposition: attachment; filename=KillsAids021.wmv
Vary: Accept-Encoding
Content-Encoding: gzip
Keep-Alive: timeout=10, max=30
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: video/x-ms-wmv
最后,问题出在 gzip 压缩上,我的网络服务器会自动对所有 php 生成的内容应用该压缩。下面是我纠正它的步骤:
首先,我建立了一个新的 php.ini 来控制共享服务器上我的个人文件夹。然后我确认我的 php.ini 文件已配置,zlib.output_compression = Off
但这并没有解决问题。
接下来我查看了 Apache 的具体设置。由于它是共享服务器,我无法直接访问任何 Apache 配置文件,但我可以通过创建 .htaccess 文件并添加以下行来控制如何处理我的网站:SetEnvIfNoCase Request_URI \.php$ no-gzip dont-vary
使用此行,我的 php 不会被压缩。这招奏效了。此解决方案的缺点是,它将导致我网站上的 php 页面的文件大小和带宽使用量更大。一个令人欣喜的好处是它将减少我们的 CPU 消耗(这是使用共享服务器的唯一限制因素,到目前为止)。最后,这绝对是一个令人欣喜的变化!
答案2
由于这个问题出现的可能性极低,我推测这与特定用户的互联网访问有关。您告诉我们,用户在多台计算机上尝试了此操作。该测试的结果是什么?在其他计算机上是否有效?
答案3
尝试其他浏览器或下载管理器均无效。最后,我让用户尝试直接下载,这招奏效了。所以问题显然出在我们基于 php 的文件服务脚本的某个地方。
我将这个问题标记为 ServerFault 的答案。如果我无法找出脚本的问题,那么我可能会在 StackOverflow 上再次发帖。