4

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

我正在运行一个存储非常大的视频文件的服务器,有些高达 650 MB。我需要用户能够请求此页面并将文件下载到他们的机器上。我已经尝试了一切,但是一个普通的 readfile() 请求在退出前挂起大约 90 秒,并给了我一个“没有收到数据错误 324 代码”,我从几个网站找到的一个分块的 readfile 脚本甚至没有开始下载,当我试图获取文件时,通过 PHP 的 FTP 解决方案只会给我错误,而我发现的唯一 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);

?>
4

3 回答 3

4

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

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

祝你好运。

于 2012-06-09T04:19:11.890 回答
0

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

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

您的网络服务器可能会缓冲。也把它关掉。你如何做取决于网络服务器,以及它为什么缓冲。

于 2012-06-09T04:25:22.340 回答
0

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

  • 首先:您的网络服务器可能会因超时而关闭连接。您应该查看 Web 服务器配置。
  • 第二:卷曲超时。我推荐看看这个帖子。
于 2012-06-09T04:42:20.563 回答