【发布时间】:2011-04-30 15:38:54
【问题描述】:
关于应用
我正在使用 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 块中我可以让系统管理员了解 php.ini 强制执行的内存限制
理想情况下,我希望尽可能使用 X-Accel-Redirect / X-Sendfile 等服务器端支持,如果这不起作用 - 我希望有一个备用代码来读取没有 readfile() 的文件。
我还不确定 while 循环中的 readfile() 和 fread() 有何不同,但似乎 while 循环会再次产生问题,正如 Downloading large files reliably in PHP 中所建议的那样
希望能得到一些帮助、建议、代码、指导。
感谢阅读。
【问题讨论】:
标签: php apache memory nginx large-files