Teil 2: PHP-Zertifizierung
- PHP-Zertifizierung
- Teil 2: PHP-Zertifizierung
Einfache Dateifunktionen Eine Auslese-Operation besteht bisher aus dem Öffnen der Datei und dann einer Schleife mit stückweisem oder komplettem Lesen der Datei. PHP bietet allerdings noch einige Funktionen zur Vereinfachung. Ein Ansatz ist fpassthru(Handle). Hiermit wird der gesamte Inhalt der D...
Einfache Dateifunktionen
Eine Auslese-Operation besteht bisher aus dem Öffnen der Datei und dann einer Schleife mit stückweisem oder komplettem Lesen der Datei. PHP bietet allerdings noch einige Funktionen zur Vereinfachung. Ein Ansatz ist fpassthru(Handle). Hiermit wird der gesamte Inhalt der Datei ausgelesen und direkt ausgegeben:
Das Ganze hat zwei Nachteile: Das vorherige Öffnen ist immer noch notwendig; und, wesentlich gravierender: Filtern auf HTML-Sonderzeichen und anderes ist nicht möglich, da die Ausgabe direkt erfolgt. Wenn Sie Eingaben von Nutzern in der Datei ablegen, ist das auch ein Sicherheitsrisiko.
$handle = fopen('datei.txt', 'r');
fpassthru($handle);
Ähnlich arbeitet readfile(Datei). Allerdings fällt das Öffnen weg. Statt des Handle wird der Dateiname angegeben. Scheitert das Öffnen, gibt es eine Fehlermeldung:
Das Problem aber bleibt: Filtern vor der Ausgabe ist nicht möglich. Anders ist das bei der Funktion file(Datei). Sie liest die Zeilen der Datei in einen Array ein. Es erfolgt keine direkte Ausgabe:
readfile('datei.txt');
Wem ein Array zu umständlich ist, der setzt auf file_get_contents(Datei) -eine Funktion, die die Inhalte der Datei direkt in einen String einliest. Auch hier müssen Sie die Datei nicht vorab öffnen. Das Gegenstück zum Schreiben heißt file_put_contents(Datei, Inhalt, Einstellung). Hiermit schreiben Sie Inhalt in die Datei. Der Inhalt kann ein String oder ein Array sein. Bei einem Array werden die Werte einfach aneinandergehängt in die Datei geschrieben. Der optionale dritte Parameter steuert einige Einstellungen. Sollte die Datei schon existieren, überschreibt file_put_contents() normalerweise den Inhalt. Mit der Einstellung FILE_APPEND wird der neue stattdessen an den bestehenden Inhalt angefügt. Existiert die Datei noch nicht, versucht PHP sie zu erstellen.
file('datei.txt');
Mehr Hilfen
Für die Arbeit mit Dateien bietet PHP noch eine Fülle an Hilfsfunktionen. An dieser Stelle führen wir einige Möglichkeiten auf, die weniger bekannt sind oder Fallstricke enthalten. Außerdem gliedern wir die Funktionen in ihre Aufgabenbereiche.
flock(Handle, Modus) sperrt eine Datei mit verschiedenen Speermodi: LOCK_SH ist eine verteilte Sperre für lesenden Zugriff und LOCK_EX eine exklusive Sperre für schreibenden Zugriff. Mit LOCK_UN hebt man die Sperre wieder auf und LOCK_NB ist eine Sperre, die andere Operationen nicht blockiert.

Für die Zugriffsrechte bietet PHP Funktionen, die oft auch per FTP-Programm genutzt werden. Mit chmod() ändern Sie die Zugriffsrechte für den Eigentümer (Owner) der Datei, für die Gruppe des Eigentümers (Group) und für alle. Die Rechte werden dabei als oktale Zahlen mit vorangestellter 0 angegeben, wobei die 7 für alle Rechte steht. Verwandt sind chown() und chgrp(). Sie ändern den Dateieigner und die Dateigruppe, allerdings nur als Superuser.
Um mit Dateien zu arbeiten, bietet PHP Funktionen, die leider nicht immer logisch benannt sind. Das Kopieren ist noch einfach, die Funktion heißt copy(Quelle, Ziel) und erwartet Quell- und Zieldatei:
chmod('datei.txt', 0755);
Die Funktion liefert als Ergebnis true, wenn das Kopieren geklappt hat. Ähnlich arbeitet rename(Quelle, Ziel) zum Umbenennen einer Datei. Allerdings erfüllt die Funktion eine doppelte Aufgabe: Neben dem Umbenennen kann sie auch dazu verwendet werden, eine Datei zu verschieben. Dazu geben Sie bei Quelle und Ziel unterschiedliche Verzeichnisse an. Für das Löschen von Dateien zuständig ist unlink(Datei). Verzeichnisse löschen Sie mit rmdir(Verzeichnis). Neue legen Sie mit mkdir(Verzeichnis) an. All diese Funktionen quittieren den Erfolgsfall mit true und melden einen Misserfolg mit false.
copy('datei.txt', 'datei.txt.old');
Datei-Informationen
Eine weitere Gruppe von Funktionen dreht sich um Informationen über Dateien. Um auf eine Datei zurückzugreifen, benötigen Sie auch hier nur ihren Namen und das Verzeichnis. Sollten Sie Informationen über das Skript selbst erhalten wollen, erhalten Sie seine Adresse in der Konstanten __FILE__.
> fileatime() ist das Datum des letzten Zugriffs. Die Angabe erfolgt als Zeitstempel seit Beginn der Unix-Epoche (1.1.1970). > filectime() entspricht der letzten Änderung des Inodes (im Prinzip ein Indexeintrag einer Datei unter Linux). > filegroup() liefert die Dateigruppe. > fileinode() enthält die Nummer des Inode-Knotens. > filemtime() Datum der letzten Änderung. > fileowner() Eigentümer der Datei. > fileperms() Angaben zu Dateirechten. > filesize() liefert die Dateigröße in Byte. > filetype() enthält den Dateityp. Beispielsweise dir.
Das folgende Beispiel setzt einige der genannten Funktionen ein und gibt die Informationen über das aktuelle Skript aus:
$datei = __FILE__;
echo 'Letzter Zugriff: ' . fileatime
($datei) . '<br />';
echo 'Eigner: ' . fileowner
($datei) . '<br />';
echo 'Größe: ' . filesize
($datei) . '<br />';
echo 'Typ: ' . filetype
($datei) . '<br />';
Wrapper und Streams
Damit das Öffnen einer Datei auf dem lokalen Dateisystem funktioniert, benötigen die Funktionen einen sogenannten Wrapper. Dazu zählen file://, aber auch https:// und https://. Das heißt, mit fopen() oder readfile() lassen sich Dateien auch über das Web-Protokoll HTTP aufrufen.

Der Aufruf funktioniert nur, wenn in der php.ini mit allow_url_fopen der Fernzugriff auf Dateien möglich ist.
<?php
$url = 'https://www.google.de/search?
hl=de&q=PHP+Zertifizierung&btnG=Google-Suche&meta=';
$handle = fopen($url, 'r');
echo '<pre>';
while (!feof($handle)) {
echo htmlspecialchars(fread
($handle, 4096)); }
echo '</pre>';
?>
Sie können auch eigene Wrapper erstellen. Dazu verwenden Sie die Funktion stream_wrapper_register(Protokoll, Klasse) und implementieren dann eine Klasse:
Die Klasse implementiert Standardfunktionen für das Lesen und Schreiben, zum Feststellen des Dateiendes und für die aktuelle Position. Diese Funktionen werden dann von den PHP-Funktionen wie fread(), feof(), ftell() und Konsorten verwendet.
class Wrapper {
function stream_open($path, $mode,
$options, &$opened_path) { }
function stream_read($count) { }
function stream_write($data) { }
function stream_tell() { }
function stream_eof() { }
function stream_seek($offset,
$whence) { } }
Im Prinzip steht hinter dem Aufruf einer Datei mit einem Wrapper ein Stream, der geöffnet wird. Dieser Datenstrom wird in einem Datei-Handle, gespeichert. Ein solcher Stream hat mehrere Bestandteile: Pipelines zum Lesen und zum Schreiben, also maximal zwei. Den Kontext mit Informationen über den Stream und die Metadaten. Außerdem lassen sich Streams mit eigenen Filtern versehen (www.php.net/manual/de/book.stream.php).
Soll die Netzwerkverbindung direkt aufgebaut werden, nutzen Sie fsockopen(Server, Port, Fehlernummer, Fehlermeldung, Timeout). Hier werden der Server und der Port angegeben. Fehlernummer und -meldung werden als Referenz übergeben.