【问题标题】:How to download a remote file in PHP fast?如何快速下载 PHP 中的远程文件?
【发布时间】:2013-07-26 09:03:40
【问题描述】:

我在 php.net 中找到了这个脚本,它允许用户下载本地文件。每当我尝试在文件名前面使用协议时,PHP 都找不到该文件。我在 php.net 中启用了 allow_url_fopen。我应该怎么做才能允许下载远程文件?

此外,即使有下载管理器的帮助,下载也确实很慢。有什么办法可以提高下载速度吗?有没有办法允许下载管理器中的“恢复下载”选项?

<?php
$file = 'https://www.example.com/test.exe';
if (file_exists($file)) {
    header('Content-Description: File Transfer');
    header('Content-Type: application/octet-stream');
    header('Content-Disposition: attachment; filename='.basename($file));
    header('Content-Transfer-Encoding: binary');
    header('Expires: 0');
    header('Cache-Control: must-revalidate');
    header('Pragma: public');
    header('Content-Length: ' . filesize($file));
    ob_clean();
    flush();
    readfile($file);
    exit;
} else echo "file not found."
?>

【问题讨论】:

  • 如果文件下载缓慢,请尝试增加服务器或下载用户可用的带宽。运行这个脚本总是会比用户直接下载文件慢
  • 你没有在附件头中添加协议没有必要
  • @Anigel:对不起,我不同意。中间人下载可以更快。
  • @DaveChen 在没有奇怪的防火墙规则或非常奇怪的代理配置的情况下,我从未经历过。即使服务器 B 的带宽比服务器 A 多,文件也只能通过服务器 B 到达用户,速度与服务器 A 发送给用户的速度一样快。
  • file_exists() 调用会很昂贵,并且会减慢传输的启动速度(您正在向远程服务器发出 2 个请求),但如果传输本身很慢,那么问题只是带宽。您需要对请求进行更精细的控制,cURL 可以为您提供,您需要使用CURLOPT_PROGRESSFUNCTION 回调来控制远程服务器的响应是否转发到客户端。或者,您可能想查看一个合适的 HTTP 客户端库,但这需要对 HTTP 协议有更广泛的了解。

标签: php url download protocols wrapper


【解决方案1】:

“继续下载”需要实现 Range 标头。您必须从请求标头中获取此标头,并在发送请求时将其传递到后端。显然,可以设置使用fopen 的 HTTP 协议包装器时将发送的标头(让我们看看我是否找到了这样的示例...)

如果要下载的文件可以通过 Internet 公开访问,为什么不使用 Location 标头将用户重定向到那里?这会将您的服务器从数据路径中删除,可能会提供最快的选项。

您的第二个最佳选择是在 Web 服务器上配置反向代理,for example with mod_rewrite。这至少将 PHP 解释器排除在外。

【讨论】:

  • 我需要对用户隐藏真实的下载 URL。 “位置”标头的问题在于它在下载管理器中显示了下载 URL。
  • 那么我建议使用专用的反向代理或将 Web 服务器配置为一个
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2012-02-10
  • 2022-11-03
  • 1970-01-01
  • 2012-12-10
  • 1970-01-01
相关资源
最近更新 更多