在PHP/Apache中提供大型受保护文件
我需要从ApacheWeb服务器提供大文件(>2gb)。这些文件是受保护的下载,所以我需要某种方式来授权用户。我正在使用的CMS使用针对MySQL数据库检查的cookie来验证用户。在服务器上,我无法控制最大执行时间,也无法控制内存限制 我的技术一直适用于小文件。在用户获得PHP(CMS)授权后,我使用readfile()提供文件,该文件存储在文档根目录上方,以防止直接访问。我读过一些关于分块下载或使用fpassthru绕过PHP内存限制的技术。但是我还没有找到一种技术来绕过最大执行时间限制 我考虑将文件存储在文档根目录中,这样我们就可以完全绕过PHP。但我不知道如何用htaccess限制访问。我需要根据数据库验证用户,然后才能为他们提供文件在PHP/Apache中提供大型受保护文件,php,apache,.htaccess,large-files,memory-limit,Php,Apache,.htaccess,Large Files,Memory Limit,我需要从ApacheWeb服务器提供大文件(>2gb)。这些文件是受保护的下载,所以我需要某种方式来授权用户。我正在使用的CMS使用针对MySQL数据库检查的cookie来验证用户。在服务器上,我无法控制最大执行时间,也无法控制内存限制 我的技术一直适用于小文件。在用户获得PHP(CMS)授权后,我使用readfile()提供文件,该文件存储在文档根目录上方,以防止直接访问。我读过一些关于分块下载或使用fpassthru绕过PHP内存限制的技术。但是我还没有找到一种技术来绕过最大执行时间限制 我
谢谢。看看
设置时间限制()
和最大执行时间
使用符号链接怎么样?如果您有一个文件夹示例:
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服务器正在处理下载。我认为最好的解决方案是:在Apache中安装,让PHP脚本授权用户,并在成功发送响应时,使用指向受保护文件位置的X-Sendfile
头。从那时起,Apache就开始向客户机提供文件服务;不是PHP。您是否尝试过使用set_time_limit(0)?+1作为mod_xsendfile
。不要在PHP中做这项工作。Apache(或者任何生产质量的web服务器)都经过优化以提供文件服务。让它完成它的工作,让你的脚本解释器不碍事。Lighttpd支持相同的头,Nginx也支持相同的操作,但是使用X-Accel-Redirect
。mod_xsendfile是更好的解决方案。但是,如果这对您不可用(共享主机/静态构建),那么我建议您使用符号链接或硬链接(如下所述),因为您仍然可以将下载服务传递到web服务器。链接是通过隐蔽性实现的安全性。没有任何东西可以阻止最终用户共享这些链接。在某些情况下,这很好,但让我们诚实地对待取舍。