2016-08-12 71 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接口的多線程可以使速度更快,但是這需要更復雜的編碼..