problem mit file(), wenn nicht vorhanden
da pinky
- php
0 Tom0 Robert Bienert0 Tom
hallo,
ich möchte die funktion file() benutzen, um damit eine andere webseite einzulesen:
$html = implode('', file($page));
soweit funktioniert das ja auch, aber wenn $page ungültig ist (z.b. dns kann nicht aufgelöst werden) wirft das ganze eine unschöne fehlermeldung aus.
gibts eine funktion um das vorher zu überprüfen ob $page eine gültige url ist?
Hello,
ich möchte die funktion file() benutzen, um damit eine andere webseite einzulesen:
$html = implode('', file($page));
soweit funktioniert das ja auch, aber wenn $page ungültig ist (z.b. dns kann nicht aufgelöst werden) wirft das ganze eine unschöne fehlermeldung aus.
gibts eine funktion um das vorher zu überprüfen ob $page eine gültige url ist?
Nein, aber eine andere Vorgehensweise würde ich Dir empfehlen.
Die PHP-Funktionen sind nicht alle eigensicher. Das bedeutet, dass manche Funktionen nicht alle denkbaren Argumente vertragen können, sondern dann eine böse Fehlermeldung auslösen, anstatt einen definierten Fehlercode zurückzugeben. Das liegt mesitens an dem varianten Ergebnistyp der Funktion.
Du solltest also bei solchen Aufgaben die Funktionen nicht schachteln, sondern deren Rückgabe- und Fehlerwerte (in $phperrormsg ) einzeln pro Stufe auswerten.
Außerdem ist das von Dir gewählte Konstrukt recht teuer. Benutze doch einfach
$html = file_get_contents($url);
wenn Du keine Multi-Thread-Fehler auswerten musst.
file_get_contents() ist genauso wie file() nicht geeignet, Multi-User-Anwendungen funktionssicher zu machen, da es kein Locking und auch keine Auswertung der lokalen und entfernten Locks zulässt.
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Moin!
ich möchte die funktion file() benutzen, um damit eine andere webseite einzulesen:
$html = implode('', file($page));
soweit funktioniert das ja auch, aber wenn $page ungültig ist (z.b. dns kann nicht aufgelöst werden) wirft das ganze eine unschöne fehlermeldung aus.
Das Fehlermeldungen-Problem bekommst du mit einem dem Funktionsnamen vorangestellten „@“ in den Griff:
$html = @implode('', @file($page));
Ich gehe hier natürlich davon aus, dass $page bereits auf Gültigkeit geprüft ist, damit du (oder irgendein anderer Webmaster Probleme bekommt). Was du allerdings in deinem Code wirklich suchst, heißt file_get_contents(). Bei lokalen Dateien kannst du deren Existenz mit file_exists() prüfen, für externe Dateien wirst du wohl nicht um das explizite Checken der Rückgabewerte herumkommen, _was man sowieso IMMER tun sollte_.
Grüße, Robert
Hello,
ich möchte die funktion file() benutzen, um damit eine andere webseite einzulesen:
$html = implode('', file($page));
soweit funktioniert das ja auch, aber wenn $page ungültig ist (z.b. dns kann nicht aufgelöst werden) wirft das ganze eine unschöne fehlermeldung aus.
Das Fehlermeldungen-Problem bekommst du mit einem dem Funktionsnamen vorangestellten „@“ in den Griff:
Nein, damit unterdrückst Du nur Deinen Freund: die Fehler- bzw. Statusmeldung.
Mehr dazu unten...
In Multi-User-Umgebungen ist es auch Unsinn, vorher mit file_exists() nachzufrragen, ob die Datei exisitert, denn von der Nachfrage bis zum Zugriff könnte ein anderer berechtigter User sei bereits gelöscht haben.
Richtig wäre es also:
ini_set('track_errors','1'); # eigene Fehlerauswertungsmöglichkeit einschalten
# $phperrormsg wird jetzt bedient
und dann
$html = @file_get_contents($page);
if (!empty($phperrormsg) or $html === false)
{
fehlerauswertung($phperrormsg); ### hier erstmal üben!
}
else
{
# normale auswertung.
}
Schau Dir einfach mal die Rückgabewerte von $phperrormsg an für die unterschiedlichsten Rahmenbedingungen:
- Datei nicht vorhanden
- Pfad nicht vorhanden / benutzbar
- Datei gesperrt (dio_*)
- ...
Leider habe ich selber noch keine Möglichkeit gefunden, PHP definierte Fehler-/Statusnummern zu entlocken, anstelle der Auswertung der Klartexte in $phperrormsg
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
Moinsen!
[…]
Das Fehlermeldungen-Problem bekommst du mit einem dem Funktionsnamen vorangestellten „@“ in den Griff:
Nein, damit unterdrückst Du nur Deinen Freund: die Fehler- bzw. Statusmeldung.
Mehr steht da ja auch nicht; ich gebe doch nicht den Tipp, „den Fehler vermeidest du, indem du ihn nicht mehr ausgeben lässt.“ Ich bitte um Entschuldigung, falls es doch so verstanden worden sein sollte.
In Multi-User-Umgebungen ist es auch Unsinn, vorher mit file_exists() nachzufrragen, ob die Datei exisitert, denn von der Nachfrage bis zum Zugriff könnte ein anderer berechtigter User sei bereits gelöscht haben.
Wäre man mit fopen() und einem anschließenden flock($handle, LOCK_SH) nicht auf der sicheren Seite (so lange man nicht auf einem NFS- oder FAT-Dateisystem arbeitet)? OK, wir könnten dann nicht mehr file_get_contents() benutzen, sondern fread().
Richtig wäre es also:
ini_set('track_errors','1'); # eigene Fehlerauswertungsmöglichkeit einschalten
# $phperrormsg wird jetzt bedient
Gibt es $phperrormsg bereits vor PHP 5?
Leider habe ich selber noch keine Möglichkeit gefunden, PHP definierte Fehler-/Statusnummern zu entlocken, anstelle der Auswertung der Klartexte in $phperrormsg
D.h., diese Variable speichert Fehlertexte statt Fehlernummern? Nun, wenn ich einen Error-Handler selbst definiere, bekommt er als ersten Parameter den PHP-Fehler, z.B. E_USER_ERROR, oder eine PHP-Fehlernummer? Das wäre ja eine mögliche Lösung.
esst mehr http://www.harte-harzer.de
Ich steh mehr auf Mozzarella, Appenzeller und Camembert ;-)
Grüße, Robert
Hello,
ini_set('track_errors','1'); # eigene Fehlerauswertungsmöglichkeit einschalten
# $phperrormsg wird jetzt bedientGibt es $phperrormsg bereits vor PHP 5?
Ich verwende es bewusst seit PHP 4, aber ich denke, das gibt es auch schon bei PHP 2
D.h., diese Variable speichert Fehlertexte statt Fehlernummern? Nun, wenn ich einen Error-Handler selbst definiere, bekommt er als ersten Parameter den PHP-Fehler, z.B. E_USER_ERROR, oder eine PHP-Fehlernummer? Das wäre ja eine mögliche Lösung.
E_USER_ERROR muss ich nochmal nachverfolgen
Harzliche Grüße vom Berg
esst mehr http://www.harte-harzer.de
Tom
echo $begrüßung;
Wäre man mit fopen() und einem anschließenden flock($handle, LOCK_SH) nicht auf der sicheren Seite (so lange man nicht auf einem NFS- oder FAT-Dateisystem arbeitet)?
Und da der OP eine HTTP-Ressource aufrufen wollte, scheidet diese Möglichkeit ebenfalls aus. Funktionierte ein File-Locking über HTTP wäre das ja ein schönes, einfaches DOS.
echo "$verabschiedung $name";