在PHP / Apache中提供大型受保护文件

时间:2010-07-06 15:07:21

标签: php apache .htaccess large-files memory-limit

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

我的技术一直用于小文件。在用户(通过CMS)授权用户之后,我使用readfile()来提供文件,该文件存储在文档根目录上以防止直接访问。我已经阅读了关于下载或使用fpassthru来绕过PHP内存限制的技术。但我还没有找到一种技术来绕过max_execution_time限制。

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

感谢。

3 个答案:

答案 0 :(得分:3)

我认为最好的解决方案:在Apache中安装mod_xsendfile,让PHP脚本授权用户,并在成功时发送一个带有X-Sendfile标题的响应,指向受保护文件的位置。从那时起,Apache完成了向客户端提供文件的工作;不是PHP。

答案 1 :(得分:1)

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