2016-08-12 73 views
0

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

我想在主要升级之前使用脚本预先生成必要的图像衍生产品之前,我们生活。

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

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

但是,如果我在命令行上调用另一个将导致生成派生链接的URL,则图像不会按预期方式生成。

我怀疑这是因为Curl实际上并没有下载图片。我也用Lynx试过,结果是一样的。

任何人都可以建议是否有办法强制卷曲或山猫自动下载图像,以便创建衍生产品?

感谢, 巴勃罗

回答

0

你要下载的所有<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接口的多线程可以使速度更快,但是这需要更复杂的编码..