通过卷曲调用生成Drupal图像衍生产品
问题描述:
我们有一种内容类型,它使用多种图像样式为我们网站的各种不同部分重新使用图像,并且需要生成大量的衍生产品。通过卷曲调用生成Drupal图像衍生产品
我想在主要升级之前使用脚本预先生成必要的图像衍生产品之前,我们生活。
我的想法是编写一个脚本,它使用Curl调用将为其创建图像派生的URL。
如果在浏览器中,我会转到一个特定的URL,导致生成一个派生图像按预期生成。这是默认的Drupal行为。
但是,如果我在命令行上调用另一个将导致生成派生链接的URL,则图像不会按预期方式生成。
我怀疑这是因为Curl实际上并没有下载图片。我也用Lynx试过,结果是一样的。
任何人都可以建议是否有办法强制卷曲或山猫自动下载图像,以便创建衍生产品?
感谢, 巴勃罗
答
你要下载的所有<img src="url" />
的? 容易,解析出SRC与DOM文档属性,并为每个图像的单独的卷曲请求,有点像这样:
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);
[email protected]::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都是绝对的。如果你想处理相关的URL,你需要使用parse_url & PHP_URL_HOST/PHP_URL_PORT/PHP_URL_PATH进行额外编码。注意:通过使用带curl_multi接口的多线程可以使速度更快,但是这需要更复杂的编码..