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

2024-04-21

我将从网站下载大量图像(+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));

}

另外,当我一次下载这么多图像时,是否有可能会破坏某些东西或使网站崩溃?


首先,我同意@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-Lengthhttp 标头的字节已下载。但是 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, not CURLOPT_OUTFILE

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从网站批量下载图像的最佳方法 的相关文章

随机推荐