web-dev-qa-db-ja.com

画像がリモートURLに存在するかどうかを確認します

本のISBNの画像の動的URLを生成しています。画像が実際にリモートURLに存在するかどうかを確認するには、PHPを使用した信頼できる方法が必要です。さまざまなPHPライブラリ、curlなどでさまざまなアプローチを試しましたが、どれもうまく動作せず、それらのいくつかは非常に遅いです。データベース内の各本について約60個のURLを生成(および確認)する必要があるという事実を考えると、これは非常に長い待ち時間です。手がかりはありますか?

45
function checkRemoteFile($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    // don't download content
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

    $result = curl_exec($ch);
    curl_close($ch);
    if($result !== FALSE)
    {
        return true;
    }
    else
    {
        return false;
    }
}

->ホストがcurlをサポートしている場合、これが最速の方法です

91
dangkhoaweb

このようにgetimagesize()メソッドを使用します

$external_link = ‘http://www.example.com/example.jpg’;
if (@getimagesize($external_link)) {
echo  “image exists “;
} else {
echo  “image does not exist “;
}
51
mohsin139

ここには「簡単な」方法はありません。最低限、HEADリクエストを生成し、結果のコンテンツタイプをチェックして、それが画像であることを確認する必要があります。リファラーの問題の可能性を考慮していません。カールはここに行く方法です。

6
ChssPly76

curl を使用できます。 curlオプションCURLOPT_NOBODYをtrueに設定するだけです。これは、ボディ情報をスキップし、ヘッドのみを取得します(したがって、httpコードも)。次に、CURLOPT_FAILONERRORを使用して、このプロセス全体をtrue/falseタイプチェックに変換できます。

4
Kevin Peno
3
timborden

私はこれを不動産の画像追跡のために行ってきました...

$im = @imagecreatefromjpeg($pathtoimg);
if($im)
  imagedestroy($im); // dont save, just ack...
elseif(!$missing[$inum])
  $img404arr[] = $inum;

それは実際の画像をダウンロードするよりも速く、「平均」100kの画像からそれぞれ約.3秒かかります。

何もダウンロードせずにヘッダーチェックを行い、200と404のどちらが得られるかを読んでほしいと思います。誰もが便利ですか?

2
Andrew Deal

https://www.experts-exchange.com からのソリューション

<?php
function url_exists($url) {
    if (!$fp = curl_init($url)) return false;
    return true;
}
?>
0
Gr Brainstorm

この時点ではおそらくミュートポイントですが、これは私にとってはうまくいきます:

function is_webfile($webfile)
{
 $fp = @fopen($webfile, "r");
 if ($fp !== false)
  fclose($fp);

 return($fp);
}
0
ChronoFish
if(@getimagesize($remoteImageURL)){
    //image exists!
}else{
    //image does not exist.
}
0
kheengz