使用PHP,我正在尝试提供大型文件(最多可能为200MB),由于授权问题,这些文件不在Web可访问目录中.目前,我使用一个readfile()调用以及一些标头来提供文件,但似乎PHP在发送之前将其加载到内存中.我打算在共享托管服务器上部署,这将不允许我使用大量内存或添加我自己的Apache模块,如X-Sendfile.
出于安全原因,我不能让我的文件位于Web可访问目录中.有没有人知道我可以在共享托管服务器上部署的内存密集度较低的方法?
编辑:
if(/* My authorization here */) {
$path = "/uploads/";
$name = $row[0]; //This is a MySQL reference with the filename
$fullname = $path . $name; //Create filename
$fd = fopen($fullname, "rb");
if ($fd) {
$fsize = filesize($fullname);
$path_parts = pathinfo($fullname);
$ext = strtolower($path_parts["extension"]);
switch ($ext) {
case "pdf":
header("Content-type: application/pdf");
break;
case "zip":
header("Content-type: application/zip");
break;
default:
header("Content-type: application/octet-stream");
break;
}
header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\"");
header("Content-length: $fsize");
header("Cache-control: private"); //use this to open files directly
while(!feof($fd)) …Run Code Online (Sandbox Code Playgroud) 我已经看到很多关于如何有效地使用PHP下载文件而不是允许直接HTTP请求(保持文件安全,跟踪下载等)的问题.
答案几乎总是PHP readfile().
但是,虽然它在使用大文件进行测试时效果很好,但是当它在拥有数百个用户的实时网站上时,下载开始挂起并且PHP内存限制已经耗尽.
那么readfile()当流量高时,导致内存爆炸的工作原理是什么呢?我以为它应该通过直接写入输出缓冲区绕过大量使用PHP内存?
编辑:(澄清一下,我正在寻找"为什么",而不是"我能做什么".我认为Apache的mod_xsend文件是规避的最好方法)