php - 如何检测 PHP 中的 X-Accel-Redirect (Nginx)/X-Sendfile (Apache) 支持?

标签 php apache memory nginx large-files

关于应用

我正在使用 PHP 开发电子商务应用程序。为了保证 URL 的安全,产品下载链接保留在 PHP 后面。有一个文件,比如 download.php,它通过 GET 接受少量参数并根据数据库验证它们。如果一切顺利,它将使用 PHP 中的 readfile() 函数提供文件。

关于问题

现在问题来了,当传递给 readfile() 的文件大于 php.ini 中设置的内存限制时 由于许多用户将在共享主机上使用此应用程序,因此我们无法更改 php.ini 设置。

在我们努力寻找解决方法的过程中,我首先认为我们可以在 while 循环中进行 fread() 调用,但它似乎会带来问题,并在此处突出显示 Downloading large files reliably in PHP

所以我最好的选择是检测/检查服务器是否支持 X-Accel-Redirect(如果是 Nginx)/X-Sendfile(如果是 Apache)

如果服务器支持 X-Accel-Redirect/X-Sendfile,我可以使用它们,并且在 else block 中我可以让系统管理员了解 php.ini 强制执行的内存限制

理想情况下,我希望尽可能使用 X-Accel-Redirect/X-Sendfile 等服务器端支持,如果这不起作用 - 我希望有一个备用代码来读取没有 readfile() 的文件。

我还不确定 while 循环中的 readfile() 和 fread() 有何不同,但似乎 while 循环会再次产生问题,正如 Downloading large files reliably in PHP 中所建议的那样。

希望能得到一些帮助、建议、代码、指导。

感谢阅读。

最佳答案

要检测是否安装了 mod_xsendfile apache 模块,您可以尝试以下代码:

if function_exists('apache_get_modules') 
      && in_array('mod_xsendfile', apache_get_modules()) { 
  header("X-Sendfile"); 
}

但这段代码只是检查模块是否仅安装,如果安装但配置错误可能会导致错误

通过 Apache 的 .htaccess 设置服务器范围变量的另一种可能方法:

<IfModule mod_xsendfile.c>
  <Files *.php>
    XSendFile On
    XSendFileAllowAbove On
    SetEnv MOD_X_SENDFILE_ENABLED 1
  </Files>
</IfModule>

并从 php 代码中检查它:

if ($_SERVER['MOD_X_SENDFILE_ENABLED']) {
  Header(...)
}

nginx 的常见想法是相同的 - 只需通过 HTTP-header 或 CGI/FastCGI 变量将状态变量的值传递给后端。

关于php - 如何检测 PHP 中的 X-Accel-Redirect (Nginx)/X-Sendfile (Apache) 支持?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4022260/

相关文章:

php - SQLSTATE[HY000] [1045] 用户 'root' @'localhost' 的访问被拒绝(使用密码 : NO) . DB_HOST 设置为 localhost

php - 使用 PHP 将 CSV 导入 MySQL 跳过重复项

facebook - 页面上的 SSL 应用程序运行良好 (https)。如何让非 SSL 访问者可以使用它?

sql-server - Ubuntu 14.04 + Lamp 1.2.4 mssql_connect 不工作

c - 为什么内存对齐会在结构内发生变化?

c++ - 新运算符(以及 malloc)无法分配 ~ 450 MB 内存

php - 单击时将数量添加到背景位置(jQuery)

php - Codeigniter - .htaccess 给出 404 页面未找到(文件位于子文件夹中)

java - Tomcat 前面的 Apache HTTPD 时 WebSocket 连接中断

c - 在程序运行时分配内存