2010-06-09 95 views
2

所以我有一堆文件,有些可以高达30-40mb 和我想用PHP来处理文件的安全性,所以我可以控制谁有权访问他们php大多数内存有效的方式来返回文件

这意味着我有一个剧本有点像这个粗略的例子

$has_permission = check_database_for_permission($user, filename); 

if ($has_permission) { 
    header('Content-Type: image/jpeg'); 
    readfile ($filename);  
    exit; 
} else { 
    // return 401 error 
} 

我会恨的每个请求加载完整的文件到内存中,因为它很快就会嚼了所有的记忆我的服务器上一些同时请求

所以一对q问题

  1. readfile是最有效的内存方式吗?
  2. 是否有一些更好的方法来实现相同的结果,我忽略了?

服务器:Apache/PHP5

感谢

回答

6

readfile是这样做的正确方法。通过一切手段不要尝试自己读取文件并将其打印输出 - 消耗过多的内存。通过readfile函数,文件的内容被直接缓冲到输出,占用了一个微不足道的暂时内存。

+0

+1删除我的答案,当你看着很明显。 – 2010-06-09 21:59:37

+0

我在Pekka的回答中输入了这条评论,它被删除了:“readfile()这样做,直接从文件中将文件复制到网络服务器的内存中。循环将数据从文件复制到PHP内存中,然后从PHP内存到网络服务器 随着readfile()系统可以选择一个最好的块大小,它可能不是8192“ – johannes 2010-06-09 22:03:26

+0

只要记住,在整个过程中,一个用户正在下载一个文件,一个PHP进程将被阻止。因此,如果您的服务器上运行了8个PHP进程并且有8个用户正在下载文件,您的网站将无法处理任何涉及PHP的更多请求,这通常意味着网站将完全冻结。 – 0scar 2010-06-09 23:10:26

3

最快的方法是当您可以将此中继到网络服务器。 Web服务器可以使用sendfile()调用来要求操作系统内核直接从文件复制到网络流。 例如利用lighttpd的时候有一种方式,PHP可以用信号通知服务器接管并做了sendfile招:

http://redmine.lighttpd.net/projects/lighttpd/wiki/X-LIGHTTPD-send-file

+0

不幸的是,我需要软件在多台服务器上运行,并且我无法保证所有模块都可用。但绝对是我会看的,谢谢 – bumperbox 2010-06-09 22:34:34

相关问题