2016-08-12 12 views
0

当社では、当社のウェブサイトのさまざまなセクションの画像を再利用するためにいくつかの画像スタイルを使用するコンテンツタイプを用意しており、 。カールコールによるDrupal画像派生物の生成

メジャーアップグレード後にライブに出る前に、スクリプトを使用して必要なイメージの派生物を事前に生成したいと考えています。

私の考えは、Curlを使って画像デリバティブが作成されるURLを呼び出すスクリプトを書くことでした。

ブラウザで、派生物の生成を引き起こす特定のURLに移動すると、イメージが期待通りに生成されます。これはデフォルトのDrupal動作です。

しかし、派生物の生成を引き起こす別のURLのコマンドラインでCurlを呼び出すと、画像が期待通りに生成されません。

Curlが実際に画像をダウンロードしていないと思われます。私もLynxで試したところ、結果は同じでした。

CurlまたはLynxに画像を自動的にダウンロードさせてデリバティブを作成させる方法があるかどうかは誰にでも知らせることができますか?

おかげで、 パブロ

答えて

0

あなたはすべての<img src="url" />年代をダウンロードしたいですか? 簡単に、ちょっとこのように、srcはのDOMDocumentと属性と各画像に対する個別のカール要求を行うアウト解析:

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; 
} 

代わりにcurl_execのが、PHPので、デフォルトの使用はignore_user_abortによってget_headers()を使用するように、おそらくはるかに高速ですあなたが実際にそれらをダウンロードするのではなく、ヘッダを取得するだけであれば、drupalはイメージ生成を中止するかもしれません。上記のコードはすべてのイメージsrcが絶対的であると仮定しています。相対URLを扱いたい場合は、parse_urlで& PHP_URL_HOST/PHP_URL_PORT/PHP_URL_PATHを追加する必要があります。注意:これはcurl_multiインターフェイスでマルチスレッドを使用する方がはるかに高速ですが、はるかに複雑なコーディングが必要になります。

関連する問題