2009-09-01 18 views
35

Ich erstelle dynamische URLs von Bildern für Buch-ISBN. Ich brauche einen zuverlässigen Weg mit PHP, um zu überprüfen, ob die Bilder tatsächlich in der Remote-URL vorhanden sind. Ich habe verschiedene Ansätze mit verschiedenen PHP-Bibliotheken, CURL usw. ausprobiert, aber keine von ihnen funktioniert gut, einige von ihnen sind geradezu langsam. Angesichts der Tatsache, dass ich ungefähr 60 URLs für jedes Buch in meiner Datenbank erzeugen (und überprüfen muss!), Ist dies eine große Wartezeit. Irgendwelche Hinweise?Überprüfen Sie, ob Bild auf Remote-URL existiert

+2

Dupe? http://stackoverflow.com/questions/981954/how-can-one-check-to-see-if-a-remote-file-exists-using-php –

+0

Ich würde sagen Duplizierung –

Antwort

0

Wenn die Bilder alle auf demselben Remote-Server (oder im selben Netzwerk) vorhanden sind, können Sie einen Web-Service auf diesem Server ausführen, der das Dateisystem auf die Image-Datei prüft und einen Bool-Wert zurückgibt Bild existiert oder nicht.

+0

Wir reden über viele Websites, die nicht unter meiner Kontrolle stehen, so dass die Möglichkeit eines Web-Service ausgeschlossen ist. –

6

Es gibt keinen "einfachen" Weg hier - mindestens müssen Sie eine HEAD Anfrage erzeugen und den resultierenden Inhaltstyp überprüfen, um sicherzustellen, dass es ein Bild ist. Das berücksichtigt keine möglichen Referrer-Probleme. Curl ist der Weg dorthin.

+1

Ich denke, eine Curl-Anfrage zu machen, ohne den Körper zu holen, ist ein einfacher Weg. – markus

2

Ich habe für meine Immobilien Bild tue dies Tracking ...

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

Es scheint 'schneller als das eigentliche Bild herunterzuladen, wobei etwa 0,3 Sekunden für jede von den Bildern, die avg 100k.

Ich wünschte, ich könnte nur einen Header-Check machen und lesen, ob ich eine 200 gegen eine 404 bekomme, ohne etwas herunterzuladen. Jeder hat das praktisch?

+0

Ich habe mehrere Methoden versucht, darunter die Curl-Methode, aber sie funktionieren nicht für mich. Dieser funktioniert, danke !! –

3

Sie könnten curl verwenden. Setzen Sie einfach die Curl-Option CURLOPT_NOBODY auf True. Dies wird Körperinformationen überspringen und nur den Kopf bekommen (also auch http-Code). Dann könnten Sie die CURLOPT_FAILONERROR verwenden diesen ganzen Prozess in eine Wahr/Falsch-Typprüfung an dieser Stelle

1

Es ist wahrscheinlich ein Mute-Punkt zu drehen, aber das funktioniert für mich:

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

return($fp); 
} 
+0

Versuchen Sie, den At-Operator zu vermeiden. –

+0

@ TörökGábor definitiv ein guter Vorschlag, aber nicht auf Punkt - Handbuch: 'Wenn das Öffnen fehlschlägt, wird ein Fehler der Ebene E_WARNING generiert. Sie können @ verwenden, um diese Warnung zu unterdrücken. –

71
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

+1

Ich denke, das ist die beste Antwort auf die Frage. Da die Option CURLOPT_NOBODY auf "true" gesetzt ist, ist dies sehr schnell. – markus

+7

Für mich liefert diese Funktion immer true, auch wenn ich falsche URL des Bildes zur Verfügung stelle. – Devnegikec

+1

In meinem Fall (Expedia, 10 + Bilder in einer Schleife), "True == file_get_contents ($ imgurl, 0, null, 0,1)" war schneller als curl – Jeffz

24

Verwendung 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 “; 
} 
+1

mit Abstand beste Antwort – danyo

+7

Direkt von http://php.net/manual/en/function.getimagesize.php - "Verwenden Sie nicht getimagesize(), um zu überprüfen, ob eine bestimmte Datei ein gültiges Bild ist. Verwenden Sie eine speziell entwickelte Lösung wie zum Beispiel die Erweiterung Fileinfo. " Diese Methode lädt die Datei herunter und ist schlechter als jede Methode, die einfach über den HEAD –

+1

To @ TimRamsey's Kommentar überprüfen kann, kommt das Problem von Nicht-Image-Dateien, so validieren Sie den Dateityp ist ein Bild, das Sie in Ordnung sein sollte. Elegante Lösung übrigens. – Praesagus

Verwandte Themen