2010-07-06 24 views
5

我需要从Apache Web服务器提供大型文件(> 2GB)。这些文件是受保护的下载文件,所以我需要某种方式来授权用户。我正在使用的CMS使用cookie检查MySQL数据库来验证用户。在服务器上,我无法控制max_execution_time,并且无法控制memory_limit。在PHP/Apache中提供大型受保护文件

我的技术一直在为小文件工作。用户通过PHP(由CMS)授权后,我使用readfile()来提供文件,该文件存储在文档根目录上方以防止直接访问。我已阅读过大量下载技术或使用fpassthru来解决PHP内存限制问题。但是我还没有找到解决max_execution_time限制的技术。

我曾考虑将文件存储在文档根目录中,因此我们可以完全绕过PHP。但我无法弄清楚的是如何用htaccess限制访问。我需要根据数据库验证用户,然后才能为其提供文件。

谢谢。

+0

您是否尝试过使用set_time_limit(0)? – igorw 2010-07-06 15:15:18

回答

3

我认为最好的解决方案是:在您的Apache中安装mod_xsendfile,让PHP脚本授权用户,并在成功发送指向受保护文件位置的标题的响应。从那时起,Apache就开始向客户端提供文件服务;不是PHP。

+0

对于'mod_xsendfile' +1。不要在PHP中完成这项工作。阿帕奇(或任何生产质量的Web服务器,就此而言)已经过优化以提供文件。让它做好工作,让你的脚本解释器不受阻碍。 Lighttpd支持相同的头文件,Nginx可以做同样的事情,但使用'X-Accel-Redirect'。 – 2010-07-12 21:56:43

+1

mod_xsendfile是**更好的**解决方案。但是,如果这不适用于您(共享主机/静态构建),那么我建议使用符号链接或硬链接(如下所述),因为您仍然可以将下载服务传递到Web服务器。 – 2010-07-12 21:59:37

+1

链接是默默无闻的安全。没有什么能阻止最终用户分享这些链接。在某些情况下没问题,但让我们诚实地对待这些权衡。 – 2010-07-12 22:02:25

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服务器正在处理下载。

相关问题