PHP cUrl - 无法获取大文件

时间:2017-12-16 10:35:47

标签: php curl

我正在使用PHP和cURL开发一个leecher网站。

以下是基本代码:

$ch = curl_init();

$url = "http://somesite.com/somefile.part1.rar";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

$file_name = basename($url);

$output = curl_exec($ch);

curl_close($ch);

file_put_contents($file_name, $output);

当文件大小很小(大约15MB)时,这段代码可以工作,文件会被提取到我的服务器,但是当文件大小很大(比如1GB左右)时,没有任何工作。

我尝试过设置10000M文件大小限制: 的post_max_size 的upload_max_filesize max_file_uploads 但那没有用。

我已经尝试将内存限制增加到512M甚至-1,但是这并没有工作。

那么如何使用cURL获取大文件?

1 个答案:

答案 0 :(得分:0)

您认为这条线的作用是什么? curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - 它告诉php捕获curl_exec的所有stdout输出,并在执行任何其他操作之前将其全部保存在内存中,这两种方法都非常慢(因为你不开始在下载100%完成之前写入磁盘,除非你在SSD上运行,磁盘速度慢,并且极度耗费内存(因为你将整个文件一次存储在内存中),这些都不是可取的。相反,做$fp=fopen(basename($url),'wb');curl_setopt($ch,CURLOPT_FILE,$fp); - 现在curl会将内容直接写入磁盘,因此速度更快(将其写入磁盘,因为它正在被下载)并且只需使用少量内存,无论如何下载文件很大。

  • 还要注意,如果你要同时运行大量的慢速下载,那么PHP-behind-a-webserver对于这项工作来说简直就是一个糟糕的工具,通常你可以运行的并发php进程数量非常多限制,并阻止整个网站在加载时加载,如果客户端由于某种原因断开连接,则会中止(请参阅ignore_user_abort()),如果脚本耗时太长,许多Web服务器将超时(例如,请参阅nginx proxy_read_timeout) ),并且php经常甚至因超时原因而自杀(参见set_time_limit())..如果是这样的话,考虑用另一种语言编写下载器(例如,Go的goroutines应该可以做到大量的并发缓慢下载,资源使用率很低,与PHP不同)