Wie kann man mit PHP prüfen, ob eine entfernte Datei existiert?

Lesezeit: 7 Minuten

Das Beste, was ich finden konnte, ein if fclose fopen type thing, macht die Seite sehr langsam geladen.

Grundsätzlich versuche ich Folgendes: Ich habe eine Liste von Websites und möchte ihre Favicons daneben anzeigen. Wenn eine Site jedoch keins hat, würde ich es gerne durch ein anderes Bild ersetzen, anstatt ein defektes Bild anzuzeigen.

  • Ich denke, Sie können CURL verwenden und die Rückgabecodes überprüfen. Aber wenn es die Geschwindigkeit ist, die ein Problem ist, tun Sie es einfach offline und cachen Sie.

    – Michał Tatarynowicz

    11. Juni 2009 um 15:55 Uhr

  • Ja, aber ich würde trotzdem empfehlen, ein Offline-Skript zu verwenden (aus Cron auszuführen), das die Liste der Websites analysiert, prüft, ob sie Favicons haben, und diese Daten für das Frontend zwischenspeichert. Wenn Sie cron nicht verwenden/können, speichern Sie zumindest die Ergebnisse für jede neue URL, die Sie überprüfen.

    – Michał Tatarynowicz

    18. Juni 2009 um 14:49 Uhr

  • Um ein defektes Bild durch ein Platzhalterbild im Browser zu ersetzen, ziehen Sie bitte eine clientseitige Lösung in Betracht onerror des Bildes zB eine Lösung mit jQuery

    Benutzer216084

    13. April 2015 um 6:27 Uhr

  • Mögliches Duplikat von PHP: Wie überprüfe ich, ob eine Bilddatei existiert?

    – Cees Timmermann

    19. Mai 2017 um 9:01 Uhr

Wie kann man mit PHP prufen ob eine entfernte Datei
Ramon Poca

Sie können curl anweisen, die HTTP-HEAD-Methode über CURLOPT_NOBODY zu verwenden.

Mehr oder weniger

$ch = curl_init("http://www.example.com/favicon.ico");

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode >= 400 -> not found, $retcode = 200, found.
curl_close($ch);

Ohnehin sparen Sie nur die Kosten für die HTTP-Übertragung, nicht den TCP-Verbindungsaufbau und -abbau. Und da die Favicons klein sind, sehen Sie möglicherweise keine große Verbesserung.

Das Ergebnis lokal zwischenzuspeichern, scheint eine gute Idee zu sein, wenn es sich als zu langsam herausstellt. HEAD prüft die Uhrzeit der Datei und gibt sie in den Headern zurück. Sie können wie Browser vorgehen und die CURLINFO_FILETIME des Symbols abrufen. In Ihrem Cache können Sie die URL => speichern [ favicon, timestamp ]. Anschließend können Sie den Zeitstempel vergleichen und das Favicon neu laden.

  • nur eine Notiz: retcode Fehler bei allen 400 Codes wären also die Validierung >= nicht nur >

    – Justin Bull

    30. April 2012 um 22:07 Uhr

  • Einige Websites blockieren den Zugriff, wenn Sie keine Zeichenfolge für den Benutzeragenten angeben. Ich schlage daher vor, dieser Anleitung zu folgen, um CURLOPT_USERAGENT zusätzlich zu CURLOPT_NOBODY hinzuzufügen: davidwalsh.name/set-user-agent-php-curl-spoof

    – lorenzo

    17. August 2012 um 22:30 Uhr


  • @Lyth 3XX Retcodes sind kein Fehler, sondern eine Umleitung. Diese sollten entweder manuell oder mit CURLOPT_FOLLOWLOCATION gehandhabt werden.

    – Ramon Poca

    14. Oktober 2013 um 14:48 Uhr

  • Verwenden Sie curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); auch um sicherzustellen, dass derselbe Code für URLs funktioniert, die mit HTTPS beginnen!

    – Krishan Gopal

    23. April 2014 um 9:57 Uhr

1646906648 955 Wie kann man mit PHP prufen ob eine entfernte Datei
Tom Haigh

Wie Pies sagt, können Sie cURL verwenden. Sie können cURL dazu bringen, Ihnen nur die Header und nicht den Body zu geben, was es möglicherweise schneller macht. Eine fehlerhafte Domain kann immer eine Weile dauern, da Sie auf die Timeout-Anfrage warten. Sie könnten wahrscheinlich die Timeout-Länge mit cURL ändern.

Hier ist ein Beispiel:

function remoteFileExists($url) {
    $curl = curl_init($url);

    //don't fetch the actual page, you only want to check the connection is ok
    curl_setopt($curl, CURLOPT_NOBODY, true);

    //do request
    $result = curl_exec($curl);

    $ret = false;

    //if request did not fail
    if ($result !== false) {
        //if request was ok, check response code
        $statusCode = curl_getinfo($curl, CURLINFO_HTTP_CODE);  

        if ($statusCode == 200) {
            $ret = true;   
        }
    }

    curl_close($curl);

    return $ret;
}

$exists = remoteFileExists('http://stackoverflow.com/favicon.ico');
if ($exists) {
    echo 'file exists';
} else {
    echo 'file does not exist';   
}

  • remoteFileExists(‘stackoverflow.com/’) gibt auch true zurück, aber es ist nur ein Link. Diese Funktion prüft nicht, ob der Inhaltstyp des Links eine Datei ist.

    – Donatas Navidonskis

    12. Dezember 2014 um 9:41 Uhr


Wie kann man mit PHP prufen ob eine entfernte Datei
lBar

Die Lösung von CoolGoose ist gut, aber bei großen Dateien schneller (da sie nur versucht, 1 Byte zu lesen):

if (false === file_get_contents("http://example.com/path/to/image",0,null,0,1)) {
    $image = $default_image;
}

  • +1. Gibt es Nachteile dieser Lösung gegenüber CURL?

    – Piazza Adriano Varoli

    15. April 2010 um 13:50 Uhr


  • kannst du einfach verwenden fopen – Wenn der Rückgabecode der Anforderung 404 ist, gibt fopen false zurück.

    – s3v3n

    2. Mai 2011 um 17:05 Uhr

  • das ist wirklich langsam und hat bei mir nicht funktioniert (was bedeutet, dass es immer noch ein kaputtes Bild angezeigt hat, wenn der Dateipfad nicht korrekt war)

    – Helmut

    29. Juli 2012 um 9:00 Uhr

  • Dieser Ansatz funktioniert nicht, wenn der Server eine Umleitung vornimmt, wenn ein Bild oder eine Datei nicht vorhanden ist. Dies geschieht, wenn eine Site mod_rewrite oder andere “Regeln” verwendet, wie Anfragen behandelt werden sollen.

    – Erik Čerpnjak

    7. August 2015 um 8:59 Uhr

Dies ist keine Antwort auf Ihre ursprüngliche Frage, sondern eine bessere Möglichkeit, das zu tun, was Sie versuchen:

Anstatt tatsächlich zu versuchen, das Favicon der Website direkt abzurufen (was ein königlicher Schmerz ist, da es /favicon.png, /favicon.ico, /favicon.gif oder sogar /path/to/favicon.png sein könnte), verwenden Sie Google:

<img src="http://www.google.com/s2/favicons?domain=[domain]">

Getan.

Wie kann man mit PHP prufen ob eine entfernte Datei
Pedro Lobito

Eine vollständige Funktion der Antwort mit den meisten Stimmen:

function remote_file_exists($url)
{
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_NOBODY, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); # handles 301/2 redirects
    curl_exec($ch);
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    if( $httpCode == 200 ){return true;}
}

Sie können es wie folgt verwenden:

if(remote_file_exists($url))
{
    //file exists, do something
}

  • Oh! Ich war die letzten paar Tage weg, aber Anfang des Monats war fast 24/7. Danke, dass du mich informiert hast!

    – Pedro Lobito

    20. Mai 2016 um 22:33 Uhr


  • Dies funktioniert nicht, wenn der Server keinen HTTP-Code antwortet (oder cUrl ihn nicht abfängt). Was mir ziemlich oft passiert. Z.B. bei Bildern.

    – Vaci

    8. April 2019 um 8:20 Uhr

  • Was passiert, wenn die URL auf eine andere URL oder https-Version umgeleitet wird? In diesem Fall kann dieser Curl-Code die Aufgabe nicht erfüllen. Der beste Weg ist, Header-Informationen abzurufen und nach der Zeichenfolge “200 ok” zu suchen, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.

    – Infoconic-Technologien

    8. August 2020 um 10:19 Uhr

  • @Infoconic Sie können hinzufügen curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);. Ich habe die Antwort aktualisiert, um sie zu behandeln 302 Weiterleitungen.

    – Pedro Lobito

    8. August 2020 um 15:08 Uhr


1646906650 234 Wie kann man mit PHP prufen ob eine entfernte Datei
Eyad Fallatah

Wenn Sie mit Bildern arbeiten, verwenden Sie getimagesize. Im Gegensatz zu file_exists unterstützt diese eingebaute Funktion entfernte Dateien. Es wird ein Array zurückgegeben, das die Bildinformationen enthält (Breite, Höhe, Typ usw.). Alles, was Sie tun müssen, ist, das erste Element im Array (die Breite) zu überprüfen. Verwenden Sie print_r, um den Inhalt des Arrays auszugeben

$imageArray = getimagesize("http://www.example.com/image.jpg");
if($imageArray[0])
{
    echo "it's an image and here is the image's info<br>";
    print_r($imageArray);
}
else
{
    echo "invalid image";
}

  • Oh! Ich war die letzten paar Tage weg, aber Anfang des Monats war fast 24/7. Danke, dass du mich informiert hast!

    – Pedro Lobito

    20. Mai 2016 um 22:33 Uhr


  • Dies funktioniert nicht, wenn der Server keinen HTTP-Code antwortet (oder cUrl ihn nicht abfängt). Was mir ziemlich oft passiert. Z.B. bei Bildern.

    – Vaci

    8. April 2019 um 8:20 Uhr

  • Was passiert, wenn die URL auf eine andere URL oder https-Version umgeleitet wird? In diesem Fall kann dieser Curl-Code die Aufgabe nicht erfüllen. Der beste Weg ist, Header-Informationen abzurufen und nach der Zeichenfolge “200 ok” zu suchen, bei der die Groß- und Kleinschreibung nicht berücksichtigt wird.

    – Infoconic-Technologien

    8. August 2020 um 10:19 Uhr

  • @Infoconic Sie können hinzufügen curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);. Ich habe die Antwort aktualisiert, um sie zu behandeln 302 Weiterleitungen.

    – Pedro Lobito

    8. August 2020 um 15:08 Uhr


1646906650 43 Wie kann man mit PHP prufen ob eine entfernte Datei
CoolGoose

if (false === file_get_contents("http://example.com/path/to/image")) {
    $image = $default_image;
}

Sollte arbeiten 😉

  • Fügen Sie @ vor der Funktion hinzu

    – Tebe

    8. August 2016 um 8:33 Uhr

987470cookie-checkWie kann man mit PHP prüfen, ob eine entfernte Datei existiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy