Model view controller 在Zend Framework MVC中提供文件

Model view controller 在Zend Framework MVC中提供文件,model-view-controller,zend-framework,Model View Controller,Zend Framework,从Zend Framework MVC提供文件时的最佳实践是什么?这些文件必须由MVC提供,因为它们受到保护 我知道您可以读入文件并将其放入响应对象中,但这似乎是一种不好的做法,因为您将把整个文件读入内存,然后为其提供服务。现在我通常会: header('Content-type: image/jpeg'); fpassthru(fopen($path, 'rb')); exit; 但这似乎也不对,因为我正在停止脚本的执行。有什么建议吗?您可以尝试使用X-Sendfile头。lighttpd和

从Zend Framework MVC提供文件时的最佳实践是什么?这些文件必须由MVC提供,因为它们受到保护

我知道您可以读入文件并将其放入响应对象中,但这似乎是一种不好的做法,因为您将把整个文件读入内存,然后为其提供服务。现在我通常会:

header('Content-type: image/jpeg');
fpassthru(fopen($path, 'rb'));
exit;

但这似乎也不对,因为我正在停止脚本的执行。有什么建议吗?

您可以尝试使用X-Sendfile头。lighttpd和更新版本的apache支持它。基本上,Web服务器将用指定的文件替换脚本的输出。缺点是它特定于Web服务器的配置,因此您可能在不支持它的主机上。

我建议构建一个超级简单脚本,用于基于票证系统检索文件,就像在CMS中生成票证到DB-filename、唯一哈希,然后重定向到超级简单文件重新查看脚本一样(file.php?hash=asd52ad3as1g5)。它将从查询中获取哈希值,并根据它获取实际文件名,然后按您使用fpassthru编写的方式将其推送到输出。哈希值必须是唯一的,并且很难猜测……

我认为只需退出()没有任何问题;您需要注意的是您可能拥有的任何输出缓冲层(gzip压缩等)。大文件可能会很快破坏这些缓冲区,因此您可能希望关闭它们,并可能使用fopen/fread循环“分块”您的输出。

这会很好,但我们这里的服务器配置出现了足够多的问题,我不想依赖于此。但如果您需要完成脚本,我认为这没什么g exit()错误它也用于内部ZF重定向;)