• Willkommen im Forum „Wetterstationsforum.info - Archiv“.
 

Neuigkeiten:

Dieses Forum dient ausschließlich zu Archivzwecken.
Für Fragen nutze bitte unser aktuelles Forum, welches du unter https://wetterstationsforum.info findest.

Hauptmenü

benötige PHP-Hilfe: "Wenn Link nicht erreichbar, dann...."

Begonnen von Wetterfrosch1971, 25.05.2017, 22:27:11

⏪ vorheriges - nächstes ⏩

Wetterfrosch1971

Hallo,

kann mir Jemand von den netten Kollegen hier verraten, wie ich mit PHP folgendes Problem gelöst bekomme:

ich führe per PHP Folgendes aus, d.h. ich lese den Inhalt eines Link in $lines:


$lines = file('http://185.70.220.40/astart.php?sn=&key=&nopic');


Wenn nun aus irgendwelchen Gründen dieser Link nicht erreichbar ist, soll stattdessen auf einen anderen Link zurückgegriffen werden


$lines = file('http://www.weatherlink.com/user/hcrb/index.php?view=main&headers=1');


wie kann ich das nun in PHP realisieren, kann ich das in etwa so machen:


$lines = file('http://185.70.220.40/astart.php?sn=&key=&nopic');

if($lines == '') {

$lines = file('http://www.weatherlink.com/user/hcrb/index.php?view=main&headers=1');
}



So hat es einigermaßen funktioniert, doch das Problem bei dieser Lösung ist, dass wenn der Link nicht erreichbar ist, dass es dann ewig dauert bis dieses Script ausgeführt wird, d.h. es wird erst ewig versucht den 1. Link zu erreichen und nach einer gefühlten Ewigkeit wird erst auf den 2. Link umgeswitscht.

Gebe ich den 1. Link mal direkt in meinen Browser ein, dann versucht der Browser ziemlich lange einen Verbindungsaufbau und erst nach einer gewissen Ewigkeit bricht er den Verbindungsaufbau zu besagtem Link ab.

Kann man das eventuell noch etwas geschickter per PHP lösen wie als ich es gemacht habe?

Danke für die Hilfe
Gruß Frank

webworker

Wenn es sauber sein soll dann prüfe auf den korrekten http-Status-Code (200) - dazu gibt es in PHP abhängig von der Serverkonfiguration diverse Möglichkeiten die in Betracht  kommen wie z.B. curl, get_headers, file_get_contents etc.

Um Timeouts zu nutzen ist curl ganz praktisch. Da hat man ne Menge Möglichkeiten.

Auch den Fall bedenken falls alle Sourcen nicht erreichbar sind  ;)

Freundliche Grüße

Rene

private Wetterstation Frohngau / Eifel
www.wetterstation-frohngau.de

Holli

Geht file() per HTTP überhaupt noch in den aktuellen PHP-Versionen? Ich meine, das wäre in PHP 5.4 oder so abgekündigt worden. Dafür sollte man grundsätzlich curl() benutzen, und dann bekommt man den Status beim Öffnen sowieso.
Dietmar

Eine Aussage, die durch ein Ausrufezeichen bekräftigt werden muß, ist zumindest zweifelhaft.
Eine Aussage, die durch mehrere Ausrufezeichen bekräftigt wird, ist definitiv falsch.
Der aktuelle Deppensport: Wir töten ein Akkusativ.

Wetterfrosch1971

#3
Bisher geht es mit file().
Meinst du ich solle statt file() einfach curl() einsetzen?

also so:


$lines = curl('http://185.70.220.40/astart.php?sn=&key=&nopic');

if($lines == '') {

$lines = curl('http://www.weatherlink.com/user/hcrb/index.php?view=main&headers=1');
}


habs gerade mit obigem Code versucht, das funktioniert nicht, setze ich statt curl() wieder file() ein, dann geht code wieder.

Achso, vielleicht ist dies noch relevant:
Ich lese dann aus $lines gewisse Werte via $last[] aus.

Gruß Frank

wneudeck

Hallo,
keinen Antwort auf die Frage von Frank, aber "file" sollte auch in PHP 7 noch gehen.
siehe hier:
http://php.net/manual/de/function.file.php

Holli

file() wird für lokale Dateizugriffe selbstverständlich weiter gehen. Für den Zugriff auf Dateien auf anderen Webservern per URL muß aber allow_url_fopen auf true gesetzt sein, und das sollte mal deaktiviert werden, weil es immer wieder als Einfallstor für Angriffe und Hacks genutzt wurde.

Auch wenn es immer noch möglich ist, sollte man file() für solche Zugriffe nicht mehr nutzen, um diese potentielle Sicherheitslücke zu schließen. Mit curl sind diese Zugriffe sicher(er).

Und nein, man kann file nicht einfach durch curl ersetzen. Die Funktion und Syntax von curl ist in der PHP-Doku erläutert.
Dietmar

Eine Aussage, die durch ein Ausrufezeichen bekräftigt werden muß, ist zumindest zweifelhaft.
Eine Aussage, die durch mehrere Ausrufezeichen bekräftigt wird, ist definitiv falsch.
Der aktuelle Deppensport: Wir töten ein Akkusativ.

Wetterfrosch1971

Hab versucht in der PHP Erklärung mit curl() klar zu kommen, werde jedoch leider nicht schlau daraus, wie ich mein Script nun umschreiben muss, dass es wieder funktioniert, dazu habe ich einfach von der Materie zu wenig Ahnung.

Kannst du mir eventuell weiterhelfen?

Vielen Dank.
Gruß Frank

TheWeatherMan

Wie wär's mit sowas?


function get_content ($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 15);
$data = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$curl_errno = curl_errno($ch);
curl_close($ch);
if ($http_code == 200 && $curl_errno == 0){
return $data;
} else {
return false;
}
}


Die Funktion liefert bei gültigem HTTP-Code den Inhalt der URL und bei ungültigen HTTP-Codes false zurück. Nach einem Timeout von 15s wird der Download automatisch abgebrochen und false zurückgeliefert. Du musst also nur noch überprüfen, was zurückgeliefert wird und bei Bedarf den Download mit dem alternativen Link ausführen.
Private Wetterstation Schenkenzell
https://www.wetter-schenkenzell.de

Wetterfrosch1971

Hört sich gut an, doch wo baue ich da jetzt meine Links ein?

der 1. Link der abgerufen werden soll ist dieser und er soll in die variable $lines gespeichert werden

http://185.70.220.40/astart.php?sn=&key=&nopic

ist dieser Link nicht erreichbar bzw. liefert keinen Inhalt, soll alternativ auf diesen Link zugegriffen werden:

http://www.weatherlink.com/user/hcrb/index.php?view=main&headers=1

kannst du mir dabei noch mal helfen?
Danke
Gruß Frank

falk

Zitat von: Wetterfrosch1971 am 25.05.2017, 22:27:11


$lines = file('http://185.70.220.40/astart.php?sn=&key=&nopic');

if($lines == '') {

$lines = file('http://www.weatherlink.com/user/hcrb/index.php?view=main&headers=1');
}



So hat es einigermaßen funktioniert, doch das Problem bei dieser Lösung ist, dass wenn der Link nicht erreichbar ist, dass es dann ewig dauert bis dieses Script ausgeführt wird, d.h. es wird erst ewig versucht den 1. Link zu erreichen und nach einer gefühlten Ewigkeit wird erst auf den 2. Link umgeswitscht.


Ich hole fremde Inhalte (DWD-Grundversorgung, etc) grundsätzlich per Cron-Job und lege diese im Webspace ab. Das hat den Vorteil, dass bei häufigen Zugriffen nicht die Last auf den externen Servern steigt. Außerdem gibt es keine Verzögerungen beim Aufruf.

Wenn dein Provider die Möglichkeit von Cron-Jobs anbietet, dann kannst du ja mal testen ob du deinen Code nicht auslagern kannst und im PHP-Skript per File nur die lokale Datei liest.