PHP 使用 cURL 下载一个巨大的电影文件 (500 MB)


PHP Downloading a Huge Movie File (500 MB) with cURL

好的,我有一个问题,希望你能帮我解决。

我正在运行一台存储非常大的视频文件的服务器,有些高达 650 MB。我需要用户能够请求此页面并让它将文件下载到他们的机器上。我已经尝试了所有方法,但是一个普通的 readfile() 请求在退出之前挂起了大约 90 秒,并给了我一个"没有收到数据错误 324 代码",我从几个网站找到的分块读取文件脚本甚至没有开始下载,FTP 通过 PHP 解决方案除了在我尝试获取文件时给我错误之外什么也没做, 我找到的唯一cURL解决方案只是在我的服务器上创建另一个文件。这不是我所需要的。

为了清楚起见,我需要用户能够将文件下载他们的计算机而不是服务器。

我不知道这段代码是垃圾还是只需要一两次调整,但任何帮助都值得赞赏!

<?php
$fn = $_GET["fn"];
echo $fn."<br/>";
$url  = $fn;
$path = "dl".$fn;
$fp = fopen($path, 'w');
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_FILE, $fp);
$data = curl_exec($ch);
curl_close($ch);
fclose($fp);
?>

我不建议使用 PHP 或任何其他脚本技术提供大型二进制文件。他们从不为此设计 - 你可以使用apache,nginx或后端的任何标准http服务器。如果你仍然需要使用PHP,那么你可能应该查看readfile_chunked。

http://php.net/readfile#48683这是一个很棒的教程。http://teddy.fr/blog/how-serve-big-files-through-php

祝你好运。

readfile() 不缓冲。但是,php 本身可能会缓冲。关闭缓冲

while (ob_get_level())
    ob_end_clean();
readfile($file);

您的 Web 服务器可能会缓冲。也把它关掉。如何执行此操作取决于Web服务器以及其缓冲的原因。

我看到两个可能发生的问题:

  • 首先:您的 Web 服务器可能会因超时而关闭连接。 您应该查看 Web 服务器配置。
  • 第二:卷曲超时。我建议看这篇文章。