如何在PHP中检测X-Accel-Redirect(Nginx)/ X-Sendfile(Apache))?

前端之家收集整理的这篇文章主要介绍了如何在PHP中检测X-Accel-Redirect(Nginx)/ X-Sendfile(Apache))?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
关于申请

我正在PHP中使用电子商务应用程序.为了保持URL的安全,产品下载链接保留在PHP之后.有一个文件,例如download.PHP,它通过GET接受几个参数,并对数据库进行验证.如果一切顺利,它在PHP中使用readfile()函数提供文件.

关于问题

现在问题出现在要传递给readfile()的文件大于在PHP.ini中设置的内存限制
由于此应用程序将被许多用户在共享托管中使用,因此我们无法继续更改PHP.ini设置.

在我们努力找到解决方法的时候,我第一次以为我们可以在while循环中执行fread()调用,但是似乎会强加这些问题以及这里突出显示Sending large files reliably in PHP

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

如果服务器支持X-Accel-Redirect / X-Sendfile,我可以使用它们,而在其他块我可以让系统管理员了解PHP.ini执行的内存限制

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

我还不确定while循环中的readfile()和fread()如何不同,但是似乎while循环会创建问题,再次如Sending 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头或CGI / FastCGI变量传递给后端.

猜你在找的PHP相关文章