"or die" fehlt - aber wo ?
Hallo!
Ich lese (mit Genehmigung) aus einer anderen Seite Informationen aus und veröffentliche sie auf meiner Seite.
Nun habe ich das Problem, daß die Quellseite manchmal nicht erreichbar ist und dann auch meine Seite nicht lädt und erst nach Minuten eine Fehlermeldung anzeigt.
Vermutlich fehlt irgendwo ein "or die" oder so was ähnliches (bin php-Laie!)
Könnte mir jemand einen Tipp geben, was man machen könnte (und wo!) ?
So lese ich die Infos aus:
<?php
$quelle = file('http://quellseite.de');
$file = array_merge($quelle);
$length = count($file);
$html = "";
for($i=0; $i<$length; $i++)
{
$html .= trim($file[$i]);
}
$pattern = "'<h4>(.*?)</h4>'i";
$match_count = preg_match_all($pattern, $html, $matches);
if($match_count>0)
{
$n = 10;
for($i=0; $i<$n && $i<$match_count; $i++)
{
echo iconv("UTF-8", "ISO-8859-1", $matches[1][$i]);
}
}
else
{
echo "Derzeit keine Infos";
}
?>
Ich würde wollen, daß meine Seite hier entweder überhaupt nichts anzeigt (aber den Rest lädt!), wenn die Quellseite nicht zu erreichen ist, oder das "else": "Derzeit keine Info"
Als Fehlermeldung kommt derzeit:
Warning: file() [function.file]: HTTP request failed! HTTP/1.1 500 Internal Server Error in /www/htdocs/meinehomepage/meineseite.php on line 2
Warning: file(http://quellseite.de) [function.file]: failed to open stream: Success in /www/htdocs/meinehomepage/meineseite.php on line 2
Für Hilfe vielen Dank!
Mich
Antwort schreiben
Antwort 1 von Hobst_Eppers vom 25.05.2019, 13:11 Options
mach folgendes draus:
<?php
if ($quelle = file('http://quellseite.de') === false) {
echo "Derzeit keine Infos";
} else {
$file = array_merge($quelle);
$length = count($file);
$html = "";
for($i=0; $i<$length; $i++)
{
$html .= trim($file[$i]);
}
$pattern = "'<h4>(.*?)</h4>'i";
$match_count = preg_match_all($pattern, $html, $matches);
if($match_count>0)
{
$n = 10;
for($i=0; $i<$n && $i<$match_count; $i++)
{
echo iconv("UTF-8", "ISO-8859-1", $matches[1][$i]);
}
}
}
?>
mit "or die()" beendet man das komplette Skript an Ort und Stelle. Bei weiteren Fragen siehe www.php.net und deren Online-Doku mit unglaublich vielen Beispielen
Antwort 2 von Supermax vom 25.05.2019, 13:33 Options
Verwende falls möglich statt file() die Funktionen der cURL-Bibliothek; da hast du bessere Kontrolle darüber, wie die Abfrage an den entfernten Server abläuft, und kannst z.B. auch ein Timeout setzen.
Antwort 3 von Mich vom 25.05.2019, 13:55 Options
Ich probiers mal aus.
Vielen Dank !
Mich
Antwort 4 von Mich vom 25.05.2019, 14:16 Options
@Hobst_Eppers:
Mit Deinem Skript bekomme ich diese Fehlermeldung:
Warning: file(http://quellseite.de) [function.file]: failed to open stream: HTTP request failed! HTTP/1.1 502 Proxy Error in /www/htdocs/meinehomepage/meineseite.php on line 2
Derzeit keine Infos
@Supermax :
könntest Du das einem php-Laien (mit einem Beispiel ?) etwas genauer erklären ?
Danke und Gruß
Mich
Antwort 6 von Mich vom 25.05.2019, 16:44 Options
@ naja
stimmt, klingt etwas hart.
Wenn ich den Dollar-Kurs wissen will fang ich ja auch ein BWL-Studium an.
Und da wird sich gewundert, wenn die besten Leute bei Supportnet verschwinden.
Vielen Dank für die Hilfen in den letzten Jahren !
Und servus
Mich
Antwort 7 von Hobst_Eppers vom 29.05.2019, 13:10 Options
Mögliche Fehlermeldungen für Teile des Codes kann man wie folgt abschalten:
<?php
$alter_wert= error_reporting(0);
if ($quelle = file('http://quellseite.de') === false) {
echo "Derzeit keine Infos";
} else {
error_reporting($alter_wert);
$file = array_merge($quelle);
$length = count($file);
$html = "";
for($i=0; $i<$length; $i++)
{
$html .= trim($file[$i]);
}
$pattern = "'<h4>(.*?)</h4>'i";
$match_count = preg_match_all($pattern, $html, $matches);
if($match_count>0)
{
$n = 10;
for($i=0; $i<$n && $i<$match_count; $i++)
{
echo iconv("UTF-8", "ISO-8859-1", $matches[1][$i]);
}
}
}
?>
Antwort 8 von Supermax vom 29.05.2019, 13:30 Options
Du kannst die Fehlerausgabe von file() (ebenso jeder anderen PHP-Funktion) auch einfach durch Voranstellen von @ vor den Funktionsnamen unterdrücken. Gerade bei Dateisystemoperationen ist das im Echtbetrieb nützlich, da ein potentieller Angreifer ansonsten über die Fehlermeldung Hinweise auf das Dateisystem des Hostrechners bekommen kann, die er unter Umständen mittels "directory transversal" (URLs mit "../" darin) ausnutzen kann.
Dein Beispiel würde mit CURL z.B. so aussehen:
$curl = curl_init('http://quellseite.de');
// Seite per GET holen
curl_setopt($curl,CURLOPT_HTTPGET,1);
// Seiteninhalt als Ergebnis von curl_exec() zurückgeben
curl_setopt($curl,CURLOPT_RETURNTRANSFER,1);
// HTTP-Header nicht in den Ergebnisstring übernehmen
curl_setopt($curl,CURLOPT_HEADER,0);
// Maximal 30 Sekunden warten
curl_setopt($curl,CURLOPT_TIMEOUT,30);
// Abfrage abschicken.
$daten = curl_exec($curl);
// HTTP Code abfragen
$fehlercode = curl_getinto($curl,CURLINFO_HTTP_CODE);
// curl-resource schließen
curl_close($curl);
if ($fehlercode == 200) {
// OK
} else {
// Fehlerbehandlung
}