PHP或Apache限制HTML标头中的内容长度


PHP or Apache limiting Content-Length in HTML Header?

我不得不通过我的Apache2/PHP服务器向一些人分发一个巨大的文件(舞会的照片),这让我有些头疼:Chrome和Firefox都显示2GB的文件大小,但文件实际上>4GB,所以我开始追踪。我正在我的php脚本中做以下事情:

header("Content-Length: ".filesize_large($fn));
header("Actual-File-Size: ".filesize_large($fn)); //Debug
readfile($fn);

filesize_large()以字符串形式返回>4gb文件的正确文件大小(是的,即使在32位PHP上也是如此)。现在是有趣的部分;实际的HTTP标头:

Content-Length: 2147483647
Actual-File-Size: 4236525700

所以filesize_large()方法工作得很好,但PHP或Apache以某种方式限制了Content-Length的值?!为什么?

Apache/2.2.22 x86,PHP 5.3.10 x86,我使用https 上的SSL

只是为了让你们相信我说filesize_large()是正确的:

function filesize_large($filename)
{
    return trim(shell_exec('stat -c %s '.escapeshellarg($filename)));
}

编辑:

在32位系统上,当通过sapi接口与apache2通信时,PHP似乎将内容长度强制转换为整数。遗憾的是,除了在文件>2GB 的情况下不包括内容大小外,没有其他解决方法

解决方法(实际上首先是一个更好的解决方案):使用mod_xsendfile

您必须使用64位操作系统才能支持Content-length标头的长整数。我建议使用Vagrant进行开发。

标题基于字符串,但内容长度基于int。如果你看看这里https://books.google.com/books?id=HTo_AmTpQPMC&pg=PA130&lpg=PA130&dq=ap_set_content_length%28r,+r-%3Finfo。大小%29&source=bl&ots=uNqmcTbkY&sig=-Wth33sukeEiSnUUwVJPtyHSpXU&hl=en&sa=X&ei=GP0SVdSlFM_jsATWvoGwBQ&ved=0CDEQ6AEwAw#v=一页&q=ap_set_content_length%28r%2C%20r-%3Finfo。size%29%3B&f=错误您将看到用于提供内容长度响应的ap_set_content_length();函数的示例。它接受来自系统函数的文件长度。尝试调用phpfilesize(),您可能会看到相同的结果。

如果您查看ap_set_content_length声明http://ci.apache.org/projects/httpd/trunk/doxygen/group__APACHE__CORE__PROTO.html#ga7ab393c56cf073ce7aadc3b7ca3db7b2您将看到该长度被声明为apr_off_t

在这里http://svn.haxx.se/dev/archive-2004-01/0871.shtml你可以读到,这种类型取决于编译器选项,在你的情况下是32位。

我建议您阅读Apache和PHP项目的源代码。