我已经看到很多关于如何有效地使用 PHP 下载文件而不是允许直接 HTTP 请求(以保证文件安全、跟踪下载等)的问题。
答案几乎总是PHP readfile() .
- Downloading large files reliably in PHP
- How to force download of big files without using too much memory?
- Best way to transparently log downloads?
但是,尽管它在使用大文件进行测试时效果很好,但当它在拥有数百名用户的实时站点上时,下载开始挂起并且 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/