如何在PHP中检测X-Accel-Redirect(Nginx)/ X-Sendfile(Apache))
关于申请
我正在PHP中使用电子商务应用程序.为了保持URL的安全,产品下载链接保留在PHP之后.有一个文件,例如download.php,它通过GET接受几个参数,并对数据库进行验证.如果一切顺利,它在PHP中使用readfile()函数提供文件. 关于问题 现在问题出现在要传递给readfile()的文件大于在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变量传递给后端. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |