我会从网站上下载很多图像(+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));
}
另外,当我一次下载那么多图片时,我是否有可能破坏某些内容或使网站崩溃?
答案 0 :(得分:2)
首先,我同意@Rudy 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