Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP/Apache中提供大型受保护文件_Php_Apache_.htaccess_Large Files_Memory Limit - Fatal编程技术网

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

在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内存限制的技术。但是我还没有找到一种技术来绕过最大执行时间限制 我

我需要从ApacheWeb服务器提供大文件(>2gb)。这些文件是受保护的下载,所以我需要某种方式来授权用户。我正在使用的CMS使用针对MySQL数据库检查的cookie来验证用户。在服务器上,我无法控制最大执行时间,也无法控制内存限制

我的技术一直适用于小文件。在用户获得PHP(CMS)授权后,我使用readfile()提供文件,该文件存储在文档根目录上方,以防止直接访问。我读过一些关于分块下载或使用fpassthru绕过PHP内存限制的技术。但是我还没有找到一种技术来绕过最大执行时间限制

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


谢谢。

看看
设置时间限制()

最大执行时间


使用符号链接怎么样?如果您有一个文件夹示例:

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服务器。链接是通过隐蔽性实现的安全性。没有任何东西可以阻止最终用户共享这些链接。在某些情况下,这很好,但让我们诚实地对待取舍。