Innerhalb if else Reaktionszeit von URL prüfen?
Phil
- php
Hallo zusammen
Meine Website importiert ein JSON von iTunes. Dieses JSON wird von Apple manchmal nur sehr langsam generiert was sich natürlich auch auf die Ladezeiten meiner Website auswirkt. Nach Möglichkeit möchte ich eine Zwischenspeicherung vermeiden.
Meine Frage ist: Gibt es eine Möglichkeit, das Lesen der Datei (file_get_contents) zu überspringen wenn die Datei innerhalb von 2 Sekunden nicht komplett gelesen wurde?
Viele Grüsse, Phil
Hi!
Meine Website importiert ein JSON von iTunes.
Ein JSON, soso - JSON ist ein Verfahren, kein Ding.
Gibt es eine Möglichkeit, das Lesen der Datei (file_get_contents) zu überspringen wenn die Datei innerhalb von 2 Sekunden nicht komplett gelesen wurde?
Schau ins PHP-Handbuch auf die Seite der Funktion und such dort nahc einem Timeout-Parameter. Kann sein, dass sie keinen direkten Parameter dafür hat, dann "versteckt" sich jedoch bestimmt etwas Brauchbares im Stream-Kontext (der sollte dort verlinkt sein).
Lo!
Hallo
Danke für die Info.
fsockopen wäre eine gute Lösung:
if(fsockopen("ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/wsSearch?term=Facebook"&media=software&lang=de_de", 80, $errno, $error, 1)) {
Allerdings erhalte ich folgende Fehlermeldung:
fsockopen() [function.fsockopen]: unable to connect to ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/wsSearch?term=Facebook"&media=software&lang=de_de:80 (php_network_getaddresses: getaddrinfo failed: Name or service not known)
Hi,
if(fsockopen("ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/wsSearch?term=Facebook"&media=software&lang=de_de", 80, $errno, $error, 1)) {
>
> Allerdings erhalte ich folgende Fehlermeldung:
Da hätte ich jetzt eher eine PHP-Parser-Fehlermeldung erwartet. Wegen des &media usw.
> fsockopen() [function.fsockopen]: unable to connect to ax.itunes.apple.com/WebObjects/MZStoreServices.woa/wa/wsSearch?term=Facebook"&media=software&lang=de\_de:80 (php\_network\_getaddresses: getaddrinfo failed: Name or service not known)
fsockopen erwartet als ersten Parameter einen Hostname, nicht eine ums Protokoll verstümmelte URL.
cu,
Andreas
--
[Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)
[O o ostern ...](http://ostereier.andreas-waechter.de/)
Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
Hi!
fsockopen wäre eine gute Lösung:
Warum willst du es dir schwer machen? Was gefällt dir denn an der Stream-Context-Lösung nicht. Die erweitert deinen bestehenden Code nur um die Timeout-Option. Stattdessen holst du dir Mehraufwand durch fsockopen(). Letzteres brauchst du nur, wenn dir die PHP-Konfiguration nicht erlaubt, URLs in den Filesystem-Funktionen zu verwenden, was wohl aber bei dir nicht der Fall ist.
Lo!
Danke für Eure Hilef!
Leider bin ich mir nicht ganz sicher, wie mit die Stream-Context Lösung hierbei weiterhelfen soll? Wie wende ich es an?
Danke!
Hi!
Leider bin ich mir nicht ganz sicher, wie mit die Stream-Context Lösung hierbei weiterhelfen soll? Wie wende ich es an?
Du erzeugst einen Streamkontext mit der im Handbuch verlinkten Funktion stream_create_context() heißt die, wenn ich mich nicht irre. Dem Stream-Kontext kann man nun Optionen setzen, wie zum Beispiel Referrer, User-Agent und auch ein Timeout. Die sind alle irgendwo aufgelistet. Diesen Stream-Kontext mit deinen individuell gesetzten Optionen übergibst du dann der file_get_contents() als entsprechenden Parameter.
Lo!
Hello,
Du erzeugst einen Streamkontext mit der im Handbuch verlinkten Funktion stream_create_context()
[...] Dem Stream-Kontext kann man nun Optionen setzen, wie zum Beispiel Referrer, User-Agent und auch ein Timeout. Die sind alle irgendwo aufgelistet.
Welches Timeout kann man denn setzen? Das für die Socket-Eröffnung, oder das für die Leseanforderung?
Wenn man lange genug den Verweisen (Links) folgt, landet man irgendwann hier:
http://de.php.net/manual/en/context.php
Das sorgt dann vielleicht für einen besseren Überblick...
Diesen Stream-Kontext mit deinen individuell gesetzten Optionen übergibst du dann der file_get_contents() als entsprechenden Parameter.
Es ist nur blöd, dass da kaum einer mehr durchsteigt...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Danke für eure super Hilfe!
Was haltet Ihr von dieser Lösung?
$opts = array("http"=>array("timeout"=>"1"));
$context = stream_context_create($opts);
if(feof(@fopen("http://www....", "r", $context))) {
// Tu was...
}
Das Ziel: Erreicht der Dateizeiger innerhalb von 1 Sekunde nicht das Ende der Datei, werden die Befehle in if nicht ausgeführt und else wird ausgeführt.
Hi!
Was haltet Ihr von dieser Lösung?
Nicht viel.
$opts = array("http"=>array("timeout"=>"1"));
Der Timeout-Parameter wird als Float erwartet. Den in Anführungszeichen zu setzen ist unsinnig, erzeugt nur unnötigen Konvertieraufwand seitens PHP.
if(feof(@fopen("http://www....", "r", $context))) {
Solche eine Schachtlung sollte man tunlichst vermeiden, weil so der Fehlerfall nicht berücksichtigt wird. Selbst wenn du die Meldung von fopen() mit dem @ unterdrückst, gibt die Funktion false zurück, das keinen gültigen Wert für feof() darstellt. Also lieber alles schrittweise und vor der Weitergabe von Werten auf Fehlerzustände prüfen.
Das Ziel: Erreicht der Dateizeiger innerhalb von 1 Sekunde nicht das Ende der Datei, werden die Befehle in if nicht ausgeführt und else wird ausgeführt.
Wie soll denn ohne einen Lesevorgang jemals das Ende erreicht werden? Es wird ja doch wohl kein Content der Länge 0 ausgeliefert werden, oder?
Lo!
Hello,
Wie soll denn ohne einen Lesevorgang jemals das Ende erreicht werden? Es wird ja doch wohl kein Content der Länge 0 ausgeliefert werden, oder?
Außerdem vermute ich, dass das Timeout für den Lesevorgang über das Socket (also nicht für die Eröffnung des Socket) immer nur dann zählt, wenn nicht geliefert werden kann. Sowie wieder ein Byte nachkleckert, müsste das mMn von vorne anfangen zu zählen. So ist es mir jedenfalls in Erinnerung.
Kann das jemand bestätigen oder dementieren?
Kann auch sein, dass das ab Beginn einer Leseanforderung anfängt zu zählen. Die wird aber i.d.R. in einer Schleife ausgeführt (z.B. in Blöcken zu 128 Bytes). Und innerhalb von file_get_contents() wird sicherlich eine Schleife ausgfeführt...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi!
[...] Dem Stream-Kontext kann man nun Optionen setzen, wie zum Beispiel Referrer, User-Agent und auch ein Timeout.
Welches Timeout kann man denn setzen? Das für die Socket-Eröffnung, oder das für die Leseanforderung?
Wenn ich Verwender bin und einfach nur alles in einem Rutsch haben will, interessiert mich weniger, woran die Übertragung scheitert. Wenn ich Admin des entfernten Systems bin, kann ich mir andere Werkzeuge zur Fehlersuche nehmen.
Diesen Stream-Kontext mit deinen individuell gesetzten Optionen übergibst du dann der file_get_contents() als entsprechenden Parameter.
Es ist nur blöd, dass da kaum einer mehr durchsteigt...
Was genau monierst du da? Dass man Filesystem-Funktionen für Datenübertragungen verwenden kann? Dass man trotzdem noch für die Datenübertragung interessanten Parameter mitgeben kann? Dass das nicht direkt in die Filesystemfunktionen eingearbeitet wurde (auf dass diese "undurchsteigbar" aufgebläht werden)? Dass die Parameter nicht audführlich beschrieben sind? Dass es so viele sind? [_]________________
Lo!