5

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

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

我考虑将文件存储在文档根目录中,这样我们就可以完全绕过 PHP。但我不知道如何使用 htaccess 限制访问。在为他们提供文件之前,我需要根据数据库验证用户。

谢谢。

4

3 回答 3

3

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

于 2010-07-12T21:49:58.637 回答
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

于 2010-07-06T15:18:18.267 回答
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 服务器正在处理下载。

于 2010-07-12T21:46:07.033 回答