it-swarm.com.de

Überprüfen Sie, ob das Bild in der fernen URL vorhanden ist

Ich erstelle dynamische URLs von Bildern für Buch-ISBNs. Ich brauche einen zuverlässigen Weg mit PHP um zu prüfen, ob die Bilder tatsächlich auf der entfernten URL existieren. Ich habe verschiedene Ansätze mit verschiedenen PHP Bibliotheken, Curl usw. Aber keiner von ihnen funktioniert gut, einige von ihnen sind ausgesprochen langsam. Angesichts der Tatsache, dass ich für jedes Buch in meiner Datenbank ungefähr 60 URLs generieren (und prüfen!) muss, ist dies eine enorme Wartezeit.

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

-> das ist der schnellste Weg, wenn Ihr Host Curl unterstützt

91
dangkhoaweb

Verwenden Sie die getimagesize () -Methode wie folgt

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

Hier gibt es keinen "einfachen" Weg - Sie müssen mindestens eine HEAD -Anforderung generieren und den resultierenden Inhaltstyp überprüfen, um sicherzustellen, dass es sich um ein Bild handelt. Hierbei werden mögliche Probleme mit Verweisen nicht berücksichtigt. Locken ist der Weg hierher.

6
ChssPly76

Sie könnten Locken verwenden. Setzen Sie einfach die Curl-Option CURLOPT_NOBODY auf true. Dadurch werden Körperinformationen übersprungen und nur der Kopf (also auch der http-Code) abgerufen. Dann können Sie den CURLOPT_FAILONERROR verwenden, um diesen gesamten Prozess in eine Prüfung des Typs "Wahr/Falsch" umzuwandeln

4
Kevin Peno
3
timborden

Ich habe dies für mein Immobilien-Bild-Tracking gemacht ...

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

Es scheint schneller zu sein als das Herunterladen des eigentlichen Bildes. Bei Bildern mit durchschnittlich 100.000 Bildern dauert es jeweils etwa 0,3 Sekunden.

Ich wünschte, ich könnte einfach einen Headercheck durchführen und nachlesen, ob ich eine 200 gegen eine 404 bekomme, ohne etwas herunterzuladen. Hat jemand das zur Hand?

2
Andrew Deal

Lösung von https://www.experts-exchange.com

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

Es ist wahrscheinlich ein stummer Punkt an diesem Punkt, aber das funktioniert für mich:

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