Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/275.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从URL向PHP服务器下载大型图像的高性能方法_Php_Curl_Download_Wget - Fatal编程技术网

从URL向PHP服务器下载大型图像的高性能方法

从URL向PHP服务器下载大型图像的高性能方法,php,curl,download,wget,Php,Curl,Download,Wget,我有一个arrray,有大约100个图像链接。图像大小约为5-10 MB。我想通过阵列循环并将所有图片下载到我的服务器。我找到了几种方法,从文件获取内容开始,但它会消耗我的内存 我也看过 Wget PHP副本 copy('http://example.com/image.php', 'local/folder/flower.jpg'); 秆 每个用户都有自己的数组(不同的图像链接)。将图片下载到我的服务器并要求最低性能(低内存使用率等)的最快方法是什么?当cURL/wget/copy接近并看到

我有一个arrray,有大约100个图像链接。图像大小约为5-10 MB。我想通过阵列循环并将所有图片下载到我的服务器。我找到了几种方法,从
文件获取内容开始,但它会消耗我的内存

我也看过

Wget

PHP副本

copy('http://example.com/image.php', 'local/folder/flower.jpg');


每个用户都有自己的数组(不同的图像链接)。将图片下载到我的服务器并要求最低性能(低内存使用率等)的最快方法是什么?

cURL/wget/copy
接近并看到:它们的吞吐量“大致相同”,并且不会使用过多内存1。但是,

这些新方法也面临同样的问题;下载是按系列进行的

(虽然涉及到许多因素,包括带宽/延迟以及服务器/处理程序之间的分布,但增加一定程度的并行性将是提高总体吞吐量的最大方法。)

wget+并行繁殖 有几种方法可用于shell_exec和wget。这些方法可以并行生成(wget)进程

由于无法直接访问特定进程正在执行的操作,这还涉及欺骗输出重定向/处理。另一方面,这是一个“相对简单”的变化,而不是一次完成的shell exec

shell exec本身也应该针对注入攻击进行加固;在使用这种shell访问时,不应忽略安全性

cURL+multi-exec 更有利可图(最初也很复杂)的方法是使用。与
curl\u exec
不同,multi-exec允许以异步方式处理curl,因此支持并行操作

这个过程有点复杂,但是;还有一些相关的问题(尽管我还没有找到这个特定问题的“杀手级问题/答案”):

实现可能还希望限制并行cURL请求的数量

我建议使用cURL,因为它避免了在处理外壳时“格外小心”。如果必须使用shell Excel,则考虑先将文件列表/目标保存到文件中,然后通过<代码> XARGS或其他方式来填充文件。使用cURL还允许对单个请求进行相关反馈

由于此操作可能会“花费一些时间”,下载可能应该通过队列/关闭请求机制完成。。但这是一个不同的蠕虫架构


1
file\u get\u contents
的问题是,它将下载的数据作为字符串获取,这可能导致“内存不足”情况,具体取决于文件大小和PHP环境


但是,没有一种cURL/wget/open方法(如果操作正确)存在此问题,因为它们直接流式传输到文件。(在这个问题中,cURL可能会耗尽内存,因为它不能正确地流式传输到文件,而是在整个文件下载到内存后调用
file\u put\u contents

性能最低?你是说最高的?
copy('http://example.com/image.php', 'local/folder/flower.jpg');
$url  = 'http://www.google.com/images/logo_sm.gif';
$path = '/var/www/html/images/images.gif';

$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$data = curl_exec($ch);

curl_close($ch);

file_put_contents($path, $data);