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

tms*_*ont 22 php memory readfile

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

答案几乎总是PHP readfile().

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

那么readfile()当流量高时,导致内存爆炸的工作原理是什么呢?我以为它应该通过直接写入输出缓冲区绕过大量使用PHP内存?

编辑:(澄清一下,我正在寻找"为什么",而不是"我能做什么".我认为Apache的mod_xsend文件是规避的最好方法)

use*_*594 5

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

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

如果多个用户必须下载该文件,则会出现问题.(在一台服务器中,托管服务提供商将限制给予每个托管用户的内存.使用这种有限的内存,使用缓冲区不是一个好主意.)

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