【问题标题】:x-sendfile alternative for Apache to download huge files with resume-supportx-sendfile 替代 Apache 下载带有恢复支持的大文件
【发布时间】:2011-11-03 12:32:09
【问题描述】:

我需要使用 PHP 和 resume-support 以编程方式启动文件下载

这些文件很重。所以像下面这样的 IO 缓冲或缓存不是一种选择

$content=file_get_contents($file);
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="' . basename($file) . '"');
header("Content-Length: ". filesize($file));
echo $content;

到目前为止,我发现的唯一可行的选项是 Apache 模块 X-sendfile。不幸的是,我们的托管服务不会安装 mod_xsendfile - 所以我们正在寻找其他托管服务提供商,但那是另一回事了。

我们正在使用 LAMP 和 yii 框架。有哪些可能的替代方案?

【问题讨论】:

  • 实际上,x-sendfile 就是为此而生的。如果您的提供商不提供此功能,它肯定不会提供任何(可用的?)替代方案,这些替代方案也必须与服务器集成。
  • Resumable downloads when using PHP to send the file? 的可能重复项 - 请注意,您可能希望 fread 文件的一部分,echo 给客户端,重复;而不是file_get_contents,这对于大文件可能会有问题。
  • @hakre:我在考虑仅使用 PHP 的解决方案,其中 URL 请求首先被 PHP 捕获,我在其中记录请求,检查文件是否存在,然后传递请求到阿帕奇
  • 您是否考虑过使用支持某种 ACL 的 CDN?例如,见here
  • @Piskvor:其实我写了一个 HTTP 服务器,所以我知道这意味着很多。尝试使 10G 接口饱和,您会看到差异(复制 1 GByte 的数据/秒,如果是 PHP 之类的模块,则复制 2 个。您看到问题了吗?您的 RAM 不够快。另外,您将通过拥有相同数据的多个副本来杀死您的 CPU 缓存...无论如何,重复的问题解决了问题,所以它仍然比 nothing 好。

标签: php apache yii


【解决方案1】:

您的主机是否允许您安装 Perlbal (http://www.danga.com/perlbal/) 之类的东西作为 apache 前面的代理?

Perlbal 允许您使用与 x-sendfile 非常相似的方法(使用 X-REPROXY-URL:/path/to/a/local/file.jpg)将文件服务卸载到它,而且它非常高性能. (LiveJournal 和 Flickr 都使用(d)它。 但是,它要求您在不同的端口上运行 apache,并在端口 80 上运行 perlbal,而您的托管服务提供商可能不喜欢这样。当然,如果你不喜欢 perlbal,你可以用 nginx 之类的东西做同样的事情。

【讨论】:

  • 不,不幸的是 perlbal 是不允许的。无论如何,我已经转移到专用服务器上,因此我可以使用 x-sendfile 等
【解决方案2】:

您可以通过阅读request headers 来模拟这一点,并使用fopenfseekfread 等以 4kb 的步长输出内容。另请参阅可能的请求标头here。您还应该实现ETag 以让客户端识别文件没有更改。

【讨论】:

    猜你喜欢
    • 2017-06-15
    • 1970-01-01
    • 2011-04-30
    • 2013-04-22
    • 1970-01-01
    • 2011-01-06
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多