2012-03-30 24 views
2

Ich habe mehr als 5000 Bild Links und ich muss einen Weg finden, um zu überprüfen, ob sie existieren. Ich habe getimagesize() verwendet, aber es hat zu lange gedauert. Die Geschwindigkeit ist für mich entscheidend.PHP: überprüfen, ob Bild existiert (Methoden)

Ich schrieb eine kleine Funktion, aber es funktioniert nicht, ich weiß nicht warum.

function img_exists($url) 
{ 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

    if(curl_exec($ch)) 
     return true; 
    else 
     return false; 

    curl_close($ch); 
} 

Momentan führe ich den Check mit PHP durch. Bitte lassen Sie mich wissen, ob es eine bessere Lösung gibt.

Beachten Sie, dass die Funktion false zurückgibt, wenn die Verbindung Timeout (1 Sekunde) ist. Die Geschwindigkeit ist kritisch.

UPDATE: Dateien befinden sich auf einem anderen Server.

+0

Die Bilder sind remote oder dieses Skript auf dem gleichen Hosting-Raum ausgeführt werden als die Bilder? Wenn ja, könnte man 'file_exists()' verwenden – RedactedProfile

Antwort

4

Wenn Sie können, curl_multi_* Funktionen sollten den gesamten Prozess schneller machen, überprüfen Sie die manual.

Auch nur eine HEAD Anfrage tun (statt GET) werden Sie durchaus einige Bytes/Zeit zu sparen, fügen Sie diese:

curl_setopt_array($ch, array(CURLOPT_HEADER => true, CURLOPT_NOBODY => true)); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'HEAD'); 
+0

Wenn Sie nicht möchten, das HEAD-Ergebnis zu sehen, fügen Sie curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); – Acyra

2

, wenn Sie Dateien auf Ihrem eigenen Server Chek müssen, können Sie einfach file_exists() verwenden - wenn Sie Remote-Dateien überprüfen müssen und haben allow_url_fopen aktiviert, Sie fopen() wie diese verwenden:

function url_exists($path){ 
    return (@fopen($path,"r")==true); 
} 

eine kleine Notiz zu Ihrer Funktion: Sie versuchen, curl_close() nach der Rückgabe eines Werts aufzurufen, so dass diese Aussage sinnlos ist, da sie niemals erreicht wird (und Speicherlecks verursachen kann, weil Sie den Stream nie schließen).

+0

Können Sie ein benutzerdefiniertes Timeout für fopen hinzufügen? – haltabush

+1

@haltabush Sie können Timeout für fsockopen – safarov

Verwandte Themen