【问题标题】:php most memory efficient way to return filesphp最节省内存的方式来返回文件
【发布时间】:2010-06-09 21:50:04
【问题描述】:

所以我有一堆文件,有些可能高达 30-40mb 我想使用 php 来处理文件的安全性,所以我可以控制谁可以访问它们

这意味着我有一个类似于这个粗略示例的脚本

$has_permission = check_database_for_permission($user, filename);

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

我不希望每次请求都将完整文件加载到内存中,因为它很快就会通过几个同时请求来消耗我服务器上的所有内存

几个问题

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

服务器:apache/php5

谢谢

【问题讨论】:

    标签: php apache


    【解决方案1】:

    readfile 是执行此操作的正确方法。无论如何不要尝试自己读取文件并将其打印到输出 - 消耗过多的内存。使用readfile 函数,文件的内容会直接缓冲到输出,占用少量的临时内存。

    【讨论】:

    • 当 Pekka 的回答被删除时,我正在输入此评论:“readfile() 执行此操作,同时将文件直接从文件复制到网络服务器的内存中。使用循环复制数据从文件到 PHP 内存,从 PHP 内存到 Web 服务器。此外,使用 readfile() 系统可以选择一个最有效的块大小,可能不是 8192"
    • 请记住,在用户下载文件的整个过程中,一个 PHP 进程将被阻止。因此,如果您的服务器上运行 8 个 PHP 进程并且有 8 个用户正在下载文件,您的网站将无法处理任何涉及 PHP 的请求,这通常意味着网站将完全冻结。
    【解决方案2】:

    最快的方法是将其转发到网络服务器。网络服务器可以使用 sendfile() 调用请求操作系统内核直接从文件复制到网络流。 例如,当使用 lighttpd 时,PHP 可以通过一种方式通知服务器接管并执行 sendfile 技巧:

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

    【讨论】:

    • 不幸的是,我需要该软件在多个服务器上运行,我不能保证该模块在所有服务器上都可用。但绝对是我会看的,谢谢
    猜你喜欢
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2021-02-23
    • 2020-05-02
    • 1970-01-01
    相关资源
    最近更新 更多