Include: Time-Out festlegen?
Alexander P.
- php
Ich binde mit PHP include eine Datei von einem anderen Server in meine Homepage ein.
Wenn der andere Server mal nicht reagiert, wird meine Homepage nur unvollständig dargestellt.
Gibt es eine Möglichkeit, selbst einen Time-Out festzulegen? Nach 5-10 Sekunden soll der Versuch, die Datei per include zu laden abgebrochen werden, falls der andere Server bis dahin nicht geantwortet hat.
Vielen Dank im Voraus.
Hi,--> das ist eine Anrede
Gibt es eine Möglichkeit, selbst einen Time-Out festzulegen? Nach 5-10 Sekunden soll der Versuch, die Datei per include zu laden abgebrochen werden, falls der andere Server bis dahin nicht geantwortet hat.
Fang den Fehler ab, da gibt es mehrere Möglichkeiten.
zB.
If(!@include("http://deinserver/bla.php")) echo "die Seite konnte nicht geladen werden;
ciao
romy --> und Aufwiedersehen sagen ist auch höflich
bitte ...
Gibt es eine Möglichkeit, selbst einen Time-Out festzulegen? Nach 5-10 Sekunden soll der Versuch, die Datei per include zu laden abgebrochen werden, falls der andere Server bis dahin nicht geantwortet hat.
Fang den Fehler ab, da gibt es mehrere Möglichkeiten.
zB.
If(!@include("http://deinserver/bla.php")) echo "die Seite konnte nicht geladen werden;
damit hast du aber immer noch den standard-timeout drin, der ziemlich lange sein kann.
es ging ihm aber um eine verkürzung, "probiere es fünf sekunden lang, wenn der andere server in der zeit nichts zurückliefert, dann nach ohne die include-datei weiter."
afaik kann man bei fsockopen() einen timeout mitgeben; damit an daten zu gelangen macht die sache aber wesentlich komplizerter als ein einfaches include.
Danke für die Antworten.
Das ganze scheint komplizierter zu sein, als angenommen.
Ich werde es wohl so einrichten, dass die Datei von dem anderen Server erst nach Betätigen eines Buttons auf meiner HP includiert wird. So wird die Seite wenigstens im Normalfall korrekt angezeigt.
cu
Hi,
damit hast du aber immer noch den standard-timeout drin, der ziemlich lange sein kann.
es ging ihm aber um eine verkürzung, "probiere es fünf sekunden lang, wenn der andere server in der zeit nichts zurückliefert, dann nach ohne die include-datei weiter."
nun würde mich es aber wirklich mal interessieren. Wir hatten letztens doch so eine Sache mit fopen()
http://forum.de.selfhtml.org/archiv/2003/5/47138/#m257218
also wenn ich den include-Befehl bzw. auch den fopen-Befehl aufrufe und die Datei oder der server nicht existiert bekomme ich in weniger als einer Sekunde das Ergebnis. Liegt das jetzt an meinem schnellen Server oder hat das andere Ursachen?
Ich frage, weil ich nicht gewisse Sachen umschreiben will, nur weil sie später oder auf anderen Servern nicht mehr funktionieren.
ciao
romy
hi romy,
also wenn ich den include-Befehl bzw. auch den fopen-Befehl aufrufe und die Datei oder der server nicht existiert bekomme ich in weniger als einer Sekunde das Ergebnis. Liegt das jetzt an meinem schnellen Server oder hat das andere Ursachen?
es gibt da m.e. verschiedene möglichkeiten, die man differenzieren muss:
möglichkeit a)
server ist erreichbar, die angeforderte datei gibt es aber nicht auf dem server. der server schickt sofort einen 404er zurück -> kein timeout-problem.
möglichkeit b)
der server an sich ist gar nicht existent. dein server, auf dem php läuft, merkt recht schnell (genau wie dein browser in so einem fall idR auch), dass sich zu dem angegebenen domainnamen beim DNS-server keine IP ermitteln lässt -> dieser fehlerfall ist auch schnell abgehakt.
möglichkeit c)
der server ist existent, aber schlecht oder gar nicht erreichbar.
genau _das_ ist m.e. der fall, wo du mit einem langen timeout zu kämpfen hast. dein php-script schickt den request los, es kommt kein 404er, und kein negativer bescheid vom dns-server, also wird jetzt erstmal längere zeit auf eine antwort vom server gewartet.
und dieses problem wirst du wahrscheinlich auch haben, denke ich, wenn du es mit deinem script versuchst. ist nur nicht so einfach zu testen, da man dafür halt einen extrem schlecht erreichbaren server braucht (vllt. sollte man es mit forum.de.selfhtml.org versuchen? *g*)
gruss,
wahsaga
Ich denke, ich habe eine Lösung gefunden.
Beim Öffnen einer Datei mit fsockopen kann man selbst einen TimeOut festlegen. Daher werde ich zunächst versuchen, die Datei mit diesem Befehl zu öffnen. Nach 5 Sekunden ist der TimeOut erreicht, eine Fehlermeldung wird zurückgegeben.
Ob der Zugriff erfolgreich war, kann ich dann mit einer if-Abfrage überprüfen und das includieren gegebenenfalls überspringen.
cu
Hi,
Ich denke, ich habe eine Lösung gefunden.
fast ;)
Beim Öffnen einer Datei mit fsockopen kann man selbst einen TimeOut festlegen. Daher werde ich zunächst versuchen, die Datei mit diesem Befehl zu öffnen. Nach 5 Sekunden ist der TimeOut erreicht, eine Fehlermeldung wird zurückgegeben.
habe ich auch gleich umgesetzt, und bin auch gleich eauf ein Problem gestossen, welches diese Lösung wieder ausser Kraft setzt (leider) Wenn nämlich die IP erreichbar ist, aber der webserver nicht, geht es wieder in eine Endlosschleife...
Was soll man da noch machen? Hoffen, dass es nicht auftritt?
ciao
romy
hi,
Beim Öffnen einer Datei mit fsockopen kann man selbst einen TimeOut festlegen. Daher werde ich zunächst versuchen, die Datei mit diesem Befehl zu öffnen. Nach 5 Sekunden ist der TimeOut erreicht, eine Fehlermeldung wird zurückgegeben.
habe ich auch gleich umgesetzt, und bin auch gleich eauf ein Problem gestossen, welches diese Lösung wieder ausser Kraft setzt (leider) Wenn nämlich die IP erreichbar ist, aber der webserver nicht, geht es wieder in eine Endlosschleife...
was meinst du mit "wenn eine ip erreichbar ist, aber der webserver nicht"?
bei fsockopen gibst du IP und port an, darüber ist doch bei port=80 idR schon eindeutig festgelegt, dass du versuchst mit dem webserver auf der rechner mit der IP zu sprechen.
wenn dieser jetzt nicht innerhalb der gesetzten frist antwortet, sollte meinem verständnis nach der gesetzte timeout zuschlagen, und fsockopen einen fehler zurückliefern.
gruss,
wahsaga
Hi,
was meinst du mit "wenn eine ip erreichbar ist, aber der webserver nicht"?
bei fsockopen gibst du IP und port an, darüber ist doch bei port=80 idR schon eindeutig festgelegt, dass du versuchst mit dem webserver auf der rechner mit der IP zu sprechen.
Ich meine damit, dass es möglich sein kann, dass die Ip anpingbar ist, aber trotzdem der webserver abgestürzt. Ich kann mich täuschen, bloss dann frage ich mich, wieso bei diesem Zustand das timeout von fsockopen bei mir nichts gebracht hat. Er hat trotzdem geladen bis er nicht mehr konnte. Habe ich aber eine Sinnlosadresse angegeben kam das Ergebnis sofort.
Kenne mich in dieser Materie wenig aus. Aber ich dachte, dass eine Adresseauch ohne webserver erreichbar ist!?
ciao
romy
hallo romy,
Ich meine damit, dass es möglich sein kann, dass die Ip anpingbar ist, aber trotzdem der webserver abgestürzt. Ich kann mich täuschen, bloss dann frage ich mich, wieso bei diesem Zustand das timeout von fsockopen bei mir nichts gebracht hat. Er hat trotzdem geladen bis er nicht mehr konnte. Habe ich aber eine Sinnlosadresse angegeben kam das Ergebnis sofort.
Kenne mich in dieser Materie wenig aus. Aber ich dachte, dass eine Adresseauch ohne webserver erreichbar ist!?
ein ping hat erstmal nichts mit dem webserver zu tun, sondern generell nur damit, ob unter der verwendeten IP-adresse überhaupt irgendein rechner erreichbar ist.
wie ich weiter oben schon schrieb,
bei fsockopen gibst du IP und port an, darüber ist doch bei port=80 idR schon eindeutig festgelegt, dass du versuchst mit dem webserver auf der rechner mit der IP zu sprechen.
ein ping und ein connect-versuch mit fsockopen sind afaik zwei unterschiedliche sachen.
es werden ja auch unterschiedliche protokolle verwendet.
der ping ist bestandteil des ICMProtokolls (Internet Control Message Protocol), während du bei einem fsockopen eine TCP-verbindung herstellst (zitat manual: "Für eine Internet-Verbindung wird eine TCP-Socket-Verbindung zu hostname über den Port port hergestellt.")
da der port explizit angegeben wird (in unserem beispiel ja port 80), sollte der rechner also, sofern dort kein webserver-dienst läuft (und auch kein anderer dienst auf port 80 lauscht), mit einem ICMP Typ 3 - Destination Unreachable/Ziel nicht erreichbar antworten ("Diese Nachricht wird von einem Gateway oder dem Zielrechner verschickt, falls das Gateway das angegebene Netz oder der Zielrechner ein Protokoll der höheren Schicht oder einen Port nicht erreichen kann." zitat http://www.protecus.de/Firewall_Security/icmp.html).
leider gibt es leute, die z.b. ihre firewall so konfigurieren, dass nicht alle ICMP-typen zugelassen werden, nach dem motto "was geht mich die stabilität des internet-datenverkehrs an".
da manche ICMP-typen auch für (d)DoS-angriffe missbraucht werden können, könnte dies als z.b. von deinem provider, oder aber von der gegenstelle geblockt worden sein, was natürlich eine zeitnahe übermittlung einer nichtverfügbarkeitmeldung des von dir per fsockopen angesprochenen webserverdienstes auf dem zielrechner behindert...
gruss,
wahsaga