首先,我同意@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
, not CURLOPT_OUTFILE
编辑2:CURLOPT_FILE想要一个文件资源,而不是文件路径,也修复了这个问题x.x