从网站批量下载图像的最佳方法

时间:2017-08-11 07:18:25

标签: php image curl

我会从网站上下载很多图像(+20.000)到我的服务器,我正在试图找出最好的方法,因为有很多图像需要下载。

目前我有以下代码可用于测试。但是有更好的解决方案还是我应该使用一些软件来做到这一点?

foreach ($products as $product) {

$url = $product->img;
$imgName = $product->product_id
$path = "images/";

$img =  $path . $imgName . ".png";

file_put_contents($img, file_get_contents($url));

}

另外,当我一次下载那么多图片时,我是否有可能破坏某些内容或使网站崩溃?

2 个答案:

答案 0 :(得分:2)

首先,我同意@Ru​​dy Palacois在这里,wget可能会更好。那说,如果你想用PHP做,curl会比file_get_contents快得多,原因有两个。

1:与file_get_contents不同,curl可以重用相同的连接来下载多个文件,而file_get_contents将创建&为每次下载关闭一个新连接,这需要时间,因此curl会更快(只要你没有使用CURLOPT_FORBID_REUSE / CURLOPT_FRESH_CONNECT,无论如何)

2:curl在下载Content-Length http标头的字节后停止下载。但file_get_contents完全忽略了这个标题,并继续下载所有内容,直到连接关闭。这可能比curl的方法慢得多,因为在连接关闭时由Web服务器决定,在某些服务器上,它比读取Content-Length字节慢得多。

(通常,curl比file_get_contents更快,因为curl支持压缩传输,gzip和deflate,file_get_contents没有...但是这通常不适用于图像,大多数常见的图像格式已经预压缩。值得注意的例外但是包括.bmp张图片

像这样:

$ch = curl_init ();
curl_setopt ( $ch, CURLOPT_ENCODING, '' ); // if you're downloading files that benefit from compression (like .bmp images), this line enables compressed transfers.
foreach ( $products as $product ) {

    $url = $product->img;
    $imgName = $product->product_id;
    $path = "images/";

    $img = $path . $imgName . ".png";
    $img=fopen($img,'wb');
    curl_setopt_array ( $ch, array (
            CURLOPT_URL => $url,
            CURLOPT_FILE => $img 
    ) );
    curl_exec ( $ch );
    fclose($img);
    // file_put_contents ( $img, file_get_contents ( $url ) );
}
curl_close ( $ch );

编辑:修正了代码破解错误,它被称为CURLOPT_FILE,而不是CURLOPT_OUTFILE

编辑2:CURLOPT_FILE想要一个文件资源,而不是文件路径,修复了x.x

答案 1 :(得分:1)

如果你有权访问shell,你可以使用WGET,我的意思是,php的主要问题,如果你是从浏览器执行这个代码,是执行时间,它会在几分钟后停止,或者它可以是永远加载并被卡住,但如果您有完整的URL和模式,我可以看到,您可以创建一个包含URL的文件,每行一个URL,list.txt,然后执行

wget -i list.txt

检查此答案https://stackoverflow.com/a/14578517/5415074