Das Beste, was ich finden konnte, eine if
fclose
fopen
Art Sache, lässt die Seite sehr langsam laden.
Grundsätzlich versuche ich Folgendes zu tun: Ich habe eine Liste von Websites und möchte deren Favoriten neben ihnen anzeigen. Wenn eine Site jedoch keine hat, möchte ich sie durch ein anderes Bild ersetzen, anstatt ein fehlerhaftes Bild anzuzeigen.
onerror
Antworten:
Sie können curl über CURLOPT_NOBODY anweisen, die HTTP-HEAD-Methode zu verwenden.
Mehr oder weniger
Auf jeden Fall sparen Sie nur die Kosten für die HTTP-Übertragung, nicht für den Aufbau und das Schließen der TCP-Verbindung. Und da die Favoriten klein sind, sehen Sie möglicherweise keine große Verbesserung.
Das lokale Zwischenspeichern des Ergebnisses scheint eine gute Idee zu sein, wenn es sich als zu langsam herausstellt. HEAD überprüft die Uhrzeit der Datei und gibt sie in den Headern zurück. Sie können Browser mögen und die CURLINFO_FILETIME des Symbols abrufen. In Ihrem Cache können Sie die URL speichern => [Favicon, Zeitstempel]. Sie können dann den Zeitstempel vergleichen und das Favicon neu laden.
quelle
retcode
Fehler bei allen 400 Codes, damit die Validierung>=
nicht nur>
Wie Pies sagen, können Sie cURL verwenden. Sie können cURL veranlassen, nur die Überschriften und nicht den Text anzugeben, wodurch es möglicherweise schneller wird. Eine fehlerhafte Domain kann immer eine Weile dauern, da Sie auf das Zeitlimit für die Anforderung warten. Sie könnten wahrscheinlich die Timeout-Länge mit cURL ändern.
Hier ist ein Beispiel:
quelle
Die Lösung von CoolGoose ist gut, bei großen Dateien jedoch schneller (da nur 1 Byte gelesen werden soll):
quelle
fopen
- wenn der Anforderungsrückgabecode 404 lautet, gibt fopen false zurück.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 Site 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:
Getan.
quelle
Wenn Sie mit Bildern arbeiten, verwenden Sie getimagesize. Im Gegensatz zu file_exists unterstützt diese integrierte Funktion Remote-Dateien. Es wird ein Array zurückgegeben, das die Bildinformationen enthält (Breite, Höhe, Typ usw.). Sie müssen lediglich das erste Element im Array (die Breite) überprüfen. Verwenden Sie print_r, um den Inhalt des Arrays auszugeben
quelle
@
vorgetimagesize
, aber für diesen Hack schuldig gefühlt habe.exif_imagetype
, und es ist viel schneller stackoverflow.com/a/38295345/1250044Eine vollständige Funktion der am häufigsten gewählten Antwort:
Sie können es so verwenden:
quelle
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
. Ich habe die Antwort aktualisiert, um302
Weiterleitungen zu verarbeiten .Dies kann erreicht werden, indem der HTTP-Statuscode (404 = nicht gefunden) abgerufen wird, der mit
file_get_contents
Docs möglich ist, die Kontextoptionen verwenden. Der folgende Code berücksichtigt Weiterleitungen und gibt den Statuscode des endgültigen Ziels ( Demo ) zurück:Wenn Sie Weiterleitungen nicht folgen möchten, können Sie dies auf ähnliche Weise tun ( Demo ):
Einige der verwendeten Funktionen, Optionen und Variablen werden in einem Blog-Beitrag, den ich geschrieben habe, ausführlicher erläutert: HEAD first with PHP Streams .
quelle
$http_response_header
Sie unter php.net/manual/en/reserved.variables.httpresponseheader.php .Sollte arbeiten ;)
quelle
Die in PHP integrierten Funktionen funktionieren möglicherweise nicht zum Überprüfen der URL, wenn die Einstellung allow_url_fopen aus Sicherheitsgründen deaktiviert ist. Curl ist eine bessere Option, da wir unseren Code zu einem späteren Zeitpunkt nicht mehr ändern müssten. Unten ist der Code, mit dem ich eine gültige URL überprüft habe:
Bitte beachten Sie die Option CURLOPT_SSL_VERIFYPEER, mit der auch die URLs überprüft werden, die mit HTTPS beginnen.
quelle
Um zu überprüfen, ob Bilder vorhanden sind,
exif_imagetype
sollte dies vorgezogen werdengetimagesize
, da es viel schneller ist.Um dies zu unterdrücken
E_NOTICE
, stellen Sie einfach den Fehlerkontrolloperator (@
) voran .Als Bonus könnten wir mit dem zurückgegebenen Wert (
IMAGETYPE_XXX
) vonexif_imagetype
auch den MIME-Typ oder die Dateierweiterung mitimage_type_to_mime_type
/ erhaltenimage_type_to_extension
.quelle
Eine radikale Lösung wäre, die Favoriten als Hintergrundbilder in einem Div über Ihrem Standardsymbol anzuzeigen. Auf diese Weise wird der gesamte Overhead auf dem Client platziert, ohne dass fehlerhafte Bilder angezeigt werden (fehlende Hintergrundbilder werden in allen AFAIK-Browsern ignoriert).
quelle
quelle
Sie könnten Folgendes verwenden:
Hat bei mir funktioniert, als ich versucht habe zu überprüfen, ob ein Bild in der URL vorhanden ist
quelle
Sie können verwenden:
quelle
Dies funktioniert bei mir, um zu überprüfen, ob eine Remote-Datei in PHP vorhanden ist:
quelle
Sie sollten HEAD-Anforderungen ausgeben, nicht GET one, da Sie den URI-Inhalt überhaupt nicht benötigen. Wie Pies oben sagte, sollten Sie nach dem Statuscode suchen (in Bereichen von 200 bis 299, und Sie können optional 3xx-Weiterleitungen folgen).
Die Antwortfrage enthält viele Codebeispiele, die hilfreich sein können: PHP / Curl: HEAD Request dauert auf einigen Websites sehr lange
quelle
Es gibt eine noch raffiniertere Alternative. Sie können die gesamte clientseitige Überprüfung mit einem JQuery-Trick durchführen.
Von http://snipplr.com/view/18782/add-a-favicon-near-external-links-with-jquery/ (der ursprüngliche Blog ist derzeit nicht verfügbar)
quelle
Alle Antworten hier, die get_headers () verwenden, führen eine GET-Anfrage aus. Es ist viel schneller / billiger, nur eine HEAD-Anfrage zu stellen.
Um sicherzustellen, dass get_headers () eine HEAD-Anforderung anstelle eines GET ausführt, sollten Sie Folgendes hinzufügen:
Um zu überprüfen, ob eine Datei vorhanden ist, sieht Ihr Code ungefähr so aus:
$ file_found gibt offensichtlich entweder false oder true zurück.
quelle
Ich weiß nicht, ob dies schneller ist, wenn die Datei nicht remote existiert, is_file () , aber Sie könnten es versuchen .
quelle
var_dump(is_file('http://cdn.sstatic.net/stackoverflow/img/sprites.png')); bool(false)
Wenn die Datei nicht extern gehostet wird, können Sie die Remote-URL in einen absoluten Pfad auf Ihrem Webserver übersetzen. Auf diese Weise müssen Sie weder CURL noch file_get_contents usw. aufrufen.
quelle
Wenn Sie das Symfony-Framework verwenden, gibt es auch eine viel einfachere Möglichkeit
HttpClientInterface
:Die Dokumente für den HttpClient sind ebenfalls sehr gut und möglicherweise einen Blick wert, wenn Sie einen genaueren Ansatz benötigen: https://symfony.com/doc/current/http_client.html
quelle
Sie können das Dateisystem verwenden: Verwenden Sie Symfony \ Component \ Filesystem \ Filesystem; Verwenden Sie Symfony \ Component \ Filesystem \ Exception \ IOExceptionInterface.
und überprüfe $ fileSystem = new Filesystem (); if ($ fileSystem-> existiert ('path_to_file') == true) {...
quelle