簡體   English   中英

PHP或Apache在HTML標頭中限制Content-Length?

[英]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)));
}

編輯:

似乎PHP在32位系統上通過sapi接口與apache2通信時,將內容長度轉換為整數。 可悲的是,沒有解決方法,除非文件> 2GB,不包括Content-Size

解決方法(實際上是一個更好的解決方案):使用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-%3Efinfo.size%29;&source=bl&ots=uNqmcTbKYy&sig=-WthHSsXUU&en=p X&ei = GP0SVdSlFM_jsATWvoGwBQ&ved = 0CDEQ6AEwAw#v = onepage&q = ap_set_content_length%28r%2C%20r-%3Efinfo.size%29%3B&f = false您將看到ap_set_content_length();示例ap_set_content_length(); 用於服務內容長度響應的功能。 它從系統功能接受文件長度。 嘗試調用php filesize() ,您可能會看到相同的結果。

如果您查看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項目的源代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM