php - 为什么 readfile() 会耗尽 PHP 内存?

标签 php memory readfile

我已经看到很多关于如何有效地使用 PHP 下载文件而不是允许直接 HTTP 请求(以保证文件安全、跟踪下载等)的问题。

答案几乎总是PHP readfile() .

但是,尽管它在使用大文件进行测试时效果很好,但当它在拥有数百名用户的实时站点上时,下载开始挂起并且 PHP 内存限制已用尽。

那么 readfile() 的工作原理是什么导致内存在流量高时爆炸得如此糟糕?我认为它应该通过直接写入输出缓冲区来绕过大量使用 PHP 内存?

编辑:(澄清一下,我正在寻找“为什么”,而不是“我能做什么”。我认为 Apache 的 mod_xsendfile 是最好的规避方法)

最佳答案

Description
int readfile ( string $filename [, bool $use_include_path = false [, resource $context ]] )
Reads a file and writes it to the output buffer*.

PHP 必须读取文件并将其写入输出缓冲区。 因此,对于 300Mb 的文件,无论您编写什么实现(通过许多小段或 1 个大块)PHP 最终都必须读取 300Mb 的文件。

如果需要多个用户下载文件,就会出现问题。 (在一台服务器中,托管服务提供商将限制分配给每个托管用户的内存。由于内存有限,使用缓冲区并不是一个好主意。)

我认为使用直接链接下载文件对于大文件来说是一种更好的方法。

关于php - 为什么 readfile() 会耗尽 PHP 内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6627952/

相关文章:

ios - IOS 上的图像缓存

中止读取文件时PHP页面超时

php/ajax - 根据其他下拉列表中的选定选项填充下拉列表

php - foreach 第二次没有获取数组数据

PHP MySQL 无法插入到文本字段

php - 如何比较来自mysql的两个时间戳值与php

windows - 在 Windows Server 上使用 PostgreSQL 9.3 无法将 work_mem 增加到 1GB 以上

c++ - Cocos2d-x自定义内存模型有哪些优势?

java - xOr 解密将整个文本文件中的正确字母替换为错误字母

c - 如何从c中的文件中正确读取某些字符串?