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

Posted

技术标签:

【中文标题】PHP 使用 cURL 下载一个巨大的电影文件 (500 MB)【英文标题】:PHP Downloading a Huge Movie File (500 MB) with cURL 【发布时间】:2012-06-13 01:39:14 【问题描述】:

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

我正在运行一个服务器,该服务器存储非常大的视频文件,有些高达 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);

?>

【问题讨论】:

ftp 是专为文件传输而设计的 http 不是那么多 那么您有使用 ftp 的解决方案吗?我也试过了,但每次我尝试通过 ftp(使用 PHP)连接和下载时,页面什么也没做,只是给我一个错误。 在您的服务器上设置 ftp 服务器,提供用户凭据。不需要 php 你能给我一些示例 PHP 代码吗?就像我说的那样,我已经尝试过了,但是每次它到达应该“下载”文件的地步时,它都会返回一个错误。 他的意思是把网络服务器从解决方案中去掉,只用一个FTP客户端连接到一个FTP服务器。 【参考方案1】:

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

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

祝你好运。

【讨论】:

这些是我以前从未涉足过的水域。我本身并没有真正需要来使用 PHP,但到目前为止,这是我知道的唯一下载文件的方法。你能给我一些关于如何通过 Apache 下载文件的指导吗? 我不推荐 Apache,它很棒,但配置起来有点困难,nginx 更容易,这里有一个例子,kbeezie.com/view/nginx-configuration-examples nginx 或 apache 与您的数据一起位于您的技术堆栈的基础存储可能是您的文件系统或mysql,他们所做的只是提供东西,大多数时候数据来自使用FCGI(即动态html)或静态文件(图像,视频文件)的php,大多数项目定义一个文件夹他们所有的静态内容并告诉 nginx 服务它,而不通过 PHP,使用 PHP 跟踪文件的名称和目录,用于生成链接。 如果您仍然需要使用 Apache,因为您有 LAMP 或 WAMP 堆栈,那么只需将文档根目录添加到您拥有所有文件的位置... DocumentRoot /srv/appname/web 命令拒绝,允许来自所有的允许【参考方案2】:

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

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

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

【讨论】:

【参考方案3】:

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

首先:您的 Web 服务器可能会因超时而关闭连接。您应该查看网络服务器配置。 第二:卷曲超时。推荐看this的帖子。

【讨论】:

以上是关于PHP 使用 cURL 下载一个巨大的电影文件 (500 MB)的主要内容,如果未能解决你的问题,请参考以下文章

php 使用进度条下载PHP / cURL文件

php使用curl下载指定大小的文件

php写curl下载文件 不是下载到服务器 让浏览器弹出下载文件,在本地下载 求高手解答

php使用curl下载指定大小的文件

PHP 使用CURL从安全网站(https)下载文件

如何与 PHP 并行进行 cURL 下载和输出?