Apache/PHP 大文件下载(>2Gb)失败

2024-01-27

我正在使用 PHP 脚本来控制下载文件的访问。这对于 2Gb 以下的任何文件都适用,但对于较大的文件则失败。

  • Apache 和 PHP 都是 64 位
  • Apache will如果直接访问则允许下载文件(我不允许)

PHP 的核心(忽略访问控制):

if (ob_get_level())  ob_end_clean();

error_log('FILETEST: '.$path.' : '.filesize($path));
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($path));
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($path));
readfile($path);
exit;

错误日志显示文件大小正常

[Tue Apr 08 11:01:16 2014] [error] [client *.*.*.*] FILETEST: /downloads/file.name : 2251373807, referer: http://myurl/files/

但访问日志的大小为负:

 *.*.*.* - - [08/Apr/2014:11:01:16 +0100] "GET /files/file.name HTTP/1.1" 200 -2043593489 "http://myurl/files/" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0"

因此浏览器拒绝下载该文件。事实上,使用 wget,它不会发送任何内容:

$ wget -S -O - http://myurl/files/file.name
--2014-04-08 11:33:38--  http://myurl/files/file.name
HTTP request sent, awaiting response... No data received.
Retrying.

尝试分块读取文件并将其暴露给浏览器,而不是用 2GB 填充本地内存并一次性刷新所有内容。

Replace readfile($path); by:

@ob_end_flush();
flush();

$fileDescriptor = fopen($file, 'rb');

while ($chunk = fread($fileDescriptor, 8192)) {
    echo $chunk;
    @ob_end_flush();
    flush();
}

fclose($fileDescriptor);
exit;

8192字节在某些情况下是一个临界点,参考php.net/fread http://php.net/fread.

添加一些微时间变量(并与文件描述符的指针位置进行比较)还可以让您控制下载的最大速度。

*(刷新输出缓冲区也稍微取决于网络服务器,使用这些命令以确保它至少尝试尽可能多地刷新。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache/PHP 大文件下载(>2Gb)失败 的相关文章

随机推荐

  • 如何更改 Vaadin 中的默认 HTML 模板

    我正在使用 Vaadin 和 Maven 应用程序 我想要的是更改默认的 html 模板 当我运行该应用程序时 生成的 HTML 如下所示
  • 我需要帮助为 SpeechSynthesizer 创建词典。某种模板,这样我就可以知道如何创建一个

    或多或少就是标题所说的 我希望创建一个希腊语文本到语音的词典 这样我就可以为 SpeechSynthesizer 创建我的语言 我在哪里可以找到某种模板 或者一些指导 或者您可以提供的任何内容都是可以接受的 因为 SpeechSynthes
  • Iron Python:Iron Python 有什么好处 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对 python 很感兴趣 但我在 NET 环境中工作 所以我正在研究 Iron Python 并想知道它的用途 你能在里面写一个应
  • 使用多处理模块

    我正在尝试使用 python 2 6 中的多处理模块 但显然有一些我不明白的东西 我希望下面的类将通过 add 发送给它的数字相加 并在 get result 方法中返回总和 下面的代码打印 0 我希望它打印 2 我错过了什么 import
  • 无法将非有限值(NA或inf)转换为整数[重复]

    这个问题在这里已经有答案了 我有一个数据框看起来像这样 survived pclass sex age sibsp parch fare embarked 0 1 1 female 29 0000 0 0 211 3375 S 1 1 1
  • 在android studio中导入类[重复]

    这个问题在这里已经有答案了 我是 Android Studio 的新手 我不知道如何在Android Studio中导入类 使用快捷键 I have used Ctrl 1 like Eclipse but it s not working
  • Swift - 从闭包中退出外部函数

    在 Kotlin 中 您可以从闭包的外部函数返回 fun main args Array
  • 如何使用基于 .Net 类属性的值自动更新 WPF TreeViewItems?

    早上好 我有一个类 其中包含从 InotifyPropertyChange 派生的数据 数据来自后台线程 该线程在特定位置搜索具有特定扩展名的文件 类的公共属性通过在单独的线程中更新数据来对事件 OnPropertyChange 做出反应
  • 如何使用 d3 画布渲染器添加鼠标事件以强制定向图?

    所有其他示例都有带有 svg append 的鼠标事件 我不知道在哪里 输入 以获取画布渲染器中的弧并添加 on click function v4 风格 我想点击获取值d 在此示例中 我应该在哪里添加处理程序 我理解这个例子下面的旧方法
  • stunnel https 被重定向到 http

    我有一个在端口 8081 上侦听的 Web 服务 它是在单声道上运行的 ServiceStack REST Web 服务 如果有帮助的话 我正在尝试使用 stunnel 来保护它 但问题是一旦我连接到https ip https ip 它被
  • 语言切换器,使用 symfony 重定向到当前页面

    在 symfony 中进行语言切换并重定向到所选语言的同一页面的最佳方法是什么 Jobeet 只是在主页上进行重定向 像这样的事情应该可以解决问题
  • 使用 Bash 正则表达式匹配 (=~),其中正则表达式包含引号(" 字符)

    我想使用 Bash 正则表达式匹配 使用 运算符 来匹配包含引号的字符串 举例来说 我有以下字符串 我想提取引号之间的文本 foo Hello World 我的第一次尝试是将正则表达式放在强引号中 以强制引号为常规字符 foo 这会失败 因
  • 找不到类“bolts.AppLinks”

    当我尝试在设备上启动 Android 应用程序时 崩溃并出现奇怪的错误 这个问题从前两天就出现了 这是错误 11 09 17 27 30 461 25146 25146 com ten ten E AndroidRuntime FATAL
  • 如何使用 boto 以编程方式检查 Amazon S3 权限?

    我们在 Amazon S3 的存储桶中有一棵茂密的树 其中包含大量文件 我刚刚发现 虽然有些文件有两个权限条目 如单击 AWS 管理控制台中的一个文件 然后单击属性 gt 权限 一行是 所有人 另一行是某个特定用户 其他文件只有一个该用户的
  • 将类函数转换为 lambda 函数

    我正在尝试拉出这样的东西 class helper some class variables public function somehelper somevar some action to somehelper somevar 我希望它
  • Android通知大图样式和大文本样式

    我已经使用大图片样式构建了推送通知 如图所示here http developer android com reference android app Notification BigPictureStyle html 是否可以混合大图片样
  • 何时在 MySQL 表中使用 NULL

    我很欣赏数据库表中 NULL 值的语义 它不同于 false 和空字符串 然而 我经常读到有关字段可为空时的性能问题的信息 并建议在 NULL 实际上在语义上正确的情况下使用空字符串 什么情况适合使用可为空字段和 NULL 值 有哪些权衡
  • Java Singleton 与 static - 是否有真正的性能优势?

    我正在合并一个 CVS 分支 较大的更改之一是用具有静态初始化块和所有静态方法的抽象类替换单例模式 这是值得保留的东西吗 因为它需要合并很多冲突 我会在什么样的情况下考虑这种重构是值得的 我们在 Weblogic 8 1 下运行这个应用程序
  • 查找包含给定文件的目录?

    我希望这是一个有趣的问题 我想找到一个包含所有给定文件的目录 到目前为止我所做的如下 在unix中查找多个文件 find type f name cache o name xml o name html 参考 http alvinalexa
  • Apache/PHP 大文件下载(>2Gb)失败

    我正在使用 PHP 脚本来控制下载文件的访问 这对于 2Gb 以下的任何文件都适用 但对于较大的文件则失败 Apache 和 PHP 都是 64 位 Apache will如果直接访问则允许下载文件 我不允许 PHP 的核心 忽略访问控制