加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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

发布时间:2020-12-13 13:59:47 所属栏目:PHP教程 来源:网络整理
导读:关于申请 我正在PHP中使用电子商务应用程序.为了保持URL的安全,产品下载链接保留在PHP之后.有一个文件,例如download.php,它通过GET接受几个参数,并对数据库进行验证.如果一切顺利,它在PHP中使用readfile()函数提供文件. 关于问题 现在问题出现在要传递给read
关于申请

我正在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变量传递给后端.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读