我们有一种内容类型,它使用多种图像样式来重新定位我们网站各种不同部分的图像,并且需要生成大量衍生产品。
我希望在重大升级之后使用脚本预先生成必要的图像衍生物。
我的想法是编写一个脚本,使用Curl调用将为其创建图像派生的URL。
如果在浏览器中我转到将导致生成衍生物的特定URL,则会按预期生成图像。这是默认的Drupal行为。
但是,如果我在命令行上调用Curl,导致另一个导致生成衍生物的URL,则不会按预期生成图像。
我怀疑它是因为Curl实际上没有下载图像。我也尝试过Lynx,结果是一样的。
有人可以建议是否有办法强制Curl或Lynx自动下载图像以便创建衍生物?
谢谢, 巴勃罗
答案 0 :(得分:0)
你想下载所有<img src="url" />
的?
easy,使用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可能会中止图像生成。警告,上面的代码假设所有图像src都是绝对的。你需要使用parse_url&amp; amp; PHP_URL_HOST / PHP_URL_PORT / PHP_URL_PATH如果你想处理相对网址..并注意:通过使用curl_multi接口的多线程可以更快地实现这一点,但这需要更复杂的编码..