我们有一种内容类型,它使用许多图像样式来为我们网站的各种不同部分重新调整图像的用途,并且需要生成大量的衍生品。
我想在重大升级后上线之前,使用一个脚本预先生成必要的图像衍生工具。
我的想法是编写一个脚本,使用Curl来调用将为其创建图像派生的URL。
如果在浏览器中,我转到一个特定的URL,它将导致派生的生成,则图像将按预期生成。这是默认的Drupal行为。
但是,如果我在命令行上调用Curl以获取另一个URL,这将导致派生的生成,则图像不会按预期生成。
我怀疑这是因为Curl实际上并没有下载图片。我也尝试了Lynx,结果是一样的。
有没有人可以建议是否有办法强制Curl或Lynx自动下载图像,以便创建衍生品?
谢谢,巴勃罗
发布于 2016-08-13 03:14:56
你想下载所有的<img src="url" />吗?很简单,用DOMDocument解析出src属性,并为每个图像发出一个单独的curl请求,有点像这样:
function downloadAllImagesFromUrl(string $url):int{
$imagesDownloaded=0;
$ch=curl_init();
if(!curl_setopt_array($ch,array(
CURLOPT_AUTOREFERER => true,
CURLOPT_BINARYTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_HTTPGET => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_CONNECTTIMEOUT => 4,
CURLOPT_TIMEOUT => 8,
CURLOPT_COOKIEFILE => "", // <<makes curl save/load cookies across requests..
CURLOPT_ENCODING => "", // << makes curl post all supported encodings, gzip/deflate/etc, makes transfers faster
CURLOPT_URL=>$url,
CURLOPT_RETURNTRANSFER=>true
))){
throw new Exception(curl_error($ch));
}
$html=curl_exec($ch);
$domd=@DOMDocument::loadHTML($html);
foreach($domd->getElementsByTagName("img") as $img){
$src=$img->getAttribute("src");
if(!$src){
continue;
}
//Warning: you might want to parse_url PHP_URL_HOST / PHP_URL_PORT / PHP_URL_PATH
// if the urls are not absolute but relative.
curl_setopt($ch,CURLOPT_URL,$src);
curl_exec($ch);
++$imagesDownloaded;
}
curl_close($ch);
return $imagesDownloaded;
}使用get_headers()可能比使用curl_exec快得多,但是因为PHP默认使用ignore_user_abort,所以如果您不实际下载它们,而只是获取它们的头文件,那么drupal可能会中止图像生成。警告,上面的代码假设所有的图像源都是绝对的。如果您想处理相对urls,则需要使用parse_url & PHP_URL_HOST / PHP_URL_PORT / PHP_URL_PATH进行额外的编码。注意:通过使用带有curl_multi接口的多线程可以更快地实现这一点,但这需要更复杂的编码。
https://stackoverflow.com/questions/38924671
复制相似问题