通过卷曲调用生成Drupal图像衍生物

时间:2016-08-12 18:50:30

标签: image curl drupal

我们有一种内容类型,它使用多种图像样式来重新定位我们网站各种不同部分的图像,并且需要生成大量衍生产品。

我希望在重大升级之后使用脚本预先生成必要的图像衍生物。

我的想法是编写一个脚本,使用Curl调用将为其创建图像派生的URL。

如果在浏览器中我转到将导致生成衍生物的特定URL,则会按预期生成图像。这是默认的Drupal行为。

但是,如果我在命令行上调用Curl,导致另一个导致生成衍生物的URL,则不会按预期生成图像。

我怀疑它是因为Curl实际上没有下载图像。我也尝试过Lynx,结果是一样的。

有人可以建议是否有办法强制Curl或Lynx自动下载图像以便创建衍生物?

谢谢, 巴勃罗

1 个答案:

答案 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接口的多线程可以更快地实现这一点,但这需要更复杂的编码..