rah*_*286 12 php memory apache nginx large-files
我正在使用PHP开发电子商务应用程序.为了保证URL的安全,产品下载链接保留在PHP之后.有一个文件,比如download.php,它通过GET接受几个参数并根据数据库验证它们.如果一切顺利,它使用PHP中的readfile()函数提供文件.
现在问题来自传递给readfile()的文件大于php.ini中设置的内存限制因为这个应用程序将被许多用户用于共享托管,我们无法继续改变php.ini设置.
在我们寻找变通方法的努力中,我首先想到我们可以在while循环中进行fread()调用,但似乎会出现问题以及突出显示在PHP中可靠地下载大文件
所以我最好的选择是检测/检查服务器是否支持X-Accel-Redirect(如果是Nginx)/ X-Sendfile(如果是Apache)
如果服务器支持X-Accel-Redirect/X-Sendfile,我可以使用它们,在else块中我可以让系统管理员知道php.ini强制执行的内存限制
理想情况下,我希望尽可能使用像X-Accel-Redirect/X-Sendfile这样的服务器端支持,如果这不起作用 - 我希望有一个回退代码来读取没有readfile()的文件.
我还不确定while循环中的readfile()和fread()是如何不同的,但似乎while循环会产生问题,再次,如在PHP中可靠地下载大文件中所建议的那样
希望得到一些帮助,建议,代码,指导.
谢谢阅读.
Vad*_*dim 12
要检测是否安装了mod_xsendfile apache模块,可以尝试以下代码:
if function_exists('apache_get_modules')
&& in_array('mod_xsendfile', apache_get_modules()) {
header("X-Sendfile");
}
Run Code Online (Sandbox Code Playgroud)
但是这段代码只是检查模块是否只安装,如果安装错误,可能会导致错误
另一种可能的方法是通过Apache的.htaccess设置服务器范围的变量:
<IfModule mod_xsendfile.c>
<Files *.php>
XSendFile On
XSendFileAllowAbove On
SetEnv MOD_X_SENDFILE_ENABLED 1
</Files>
</IfModule>
Run Code Online (Sandbox Code Playgroud)
并检查它形式的PHP代码:
if ($_SERVER['MOD_X_SENDFILE_ENABLED']) {
Header(...)
}
Run Code Online (Sandbox Code Playgroud)
nginx的共同点是相同的 - 只需通过HTTP-header或CGI/FastCGI变量将状态变量的值传递给后端.
readfile不占用大量内存。它打开文件,读取一小部分,将该部分写入浏览器,然后重用内存以进行下一次读取。fread+echo这与在 while 循环中使用相同。你不会受到内存限制的限制,但你会受到max_execution_time诸如此类的限制。
如果您想使用X-Accel-RedirectWeb 服务器提供的支持(或类似支持),请发送如下标头(对于 Nginx):
header('X-Accel-Redirect: /path/to/file');
Run Code Online (Sandbox Code Playgroud)
您的应用程序无法知道服务器是否支持此功能。您需要提供一个配置选项,以便软件的管理员/安装人员可以手动提供此类信息。
| 归档时间: |
|
| 查看次数: |
9993 次 |
| 最近记录: |