我需要从Apache Web服务器提供大文件(> 2gb)。这些文件是受保护的下载,因此我需要某种方式来授权用户。我正在使用的CMS使用针对MySQL数据库检查的cookie来验证用户。在服务器上,我无法控制max_execution_time,并且无法控制memory_limit。
我的技术一直用于小文件。在用户(通过CMS)授权用户之后,我使用readfile()来提供文件,该文件存储在文档根目录上以防止直接访问。我已经阅读了关于下载或使用fpassthru来绕过PHP内存限制的技术。但我还没有找到一种技术来绕过max_execution_time限制。
我考虑过将文件存储在文档根目录中,因此我们可以完全绕过PHP。但我无法弄清楚如何使用htaccess限制访问。我需要先针对数据库验证用户,然后再将其提供给文件。
感谢。
答案 0 :(得分:3)
我认为最好的解决方案:在Apache中安装mod_xsendfile
,让PHP脚本授权用户,并在成功时发送一个带有X-Sendfile
标题的响应,指向受保护文件的位置。从那时起,Apache完成了向客户端提供文件的工作;不是PHP。
答案 1 :(得分:1)
看看set_time_limit()
http://www.php.net/manual/en/function.set-time-limit.php
和max_execution_time
http://www.php.net/manual/en/info.configuration.php#ini.max-execution-time
答案 2 :(得分:1)
使用符号链接怎么样?如果您有一个文件夹示例:
userfacingfiles/
md5_of_order_id1 --> protected-file.exe
md5_of_order_id2 --> protected-file.exe
protectedfiles/
.htaccess (contains deny from all)
protected-file.exe
基本示例:
$salt = 'canttouchthis';
function create_symlink($order_id, $salt, $protected_file)
{
$info = pathinfo('protectedfiles/'.$protected_file);
symlink('protectedfiles/'.$protected_file, 'userfacingfiles/'.md5($order_id.$salt).'.'.$info['extension']);
}
function get_file($order_id, $salt, $extension)
{
header('Location: userfacingfiles/'.md5($order_id.$salt).'.'.$extension);
exit();
}
用法:
当用户付款时:
create_symlink(1, 'secureSALT', 'ebook.pdf');
当用户想要下载电子书时
get_file(1, 'secureSALT');
这可能不是最便携的方法,但由于您正在重定向用户,因此Web服务器正在处理下载。