PHP cUrl - 无法获取大文件[重复]

问题描述 投票:1回答:1

我正在使用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左右)时,没有任何工作。

我已经尝试为:post_max_size upload_max_filesize max_file_uploads设置10000M文件大小限制,但这不起作用。

我试图将内存限制增加到512M甚至-1,但这不起作用。

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

php curl
1个回答
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会将内容直接写入磁盘,因此速度更快(在下载时将其写入磁盘)并且只需使用少量ram,无论下载文件有多大。

  • 还要注意,如果你要同时运行大量的慢速下载,那么PHP-behind-a-webserver对于这项工作来说简直就是一个糟糕的工具,通常你可以运行的并发php进程数量非常有限,并阻止你的整个网站从加载时全部忙,如果客户端由于某种原因断开连接,php就会中止(参见ignore_user_abort()),如果脚本需要太长时间(例如参见nginx proxy_read_timeout),很多web服务器都会超时甚至因为超时原因而自杀(参见set_time_limit())..如果是这种情况,请考虑用另一种语言编写下载器(例如,Go的goroutines应该能够在资源使用很少的情况下进行大量的并发慢速下载,不同于PHP)
© www.soinside.com 2019 - 2024. All rights reserved.