Dateizugriffe
In diesem Thema wollen wir uns damit beschäftigen, wie Sie mit Dateien arbeiten können. Hierzu zählt das Lesen, Schreiben und
Anhängen von / an Dateien sowie das Einbinden von Dateien, um Quellcode auszulagern. In den Beispielen der Unterthemen
Dateiinhalt einlesen und Arbeiten mit Datei-Handles wird die folgende
Text-Datei verwendet (Zeilenumbruch mittels \r\n
):
Wichtig: Die Datei dient nur zum Test. Diese Datei enthält ein paar Zeilen mit "reinem" Text. Verwendet wird die Datei mit verschiedenen PHP-Funktionen. Zur Erinnerung: Die Datei dient nur zum Test.
Möchten Sie prüfen, ob eine Datei existiert, so können Sie die Funktion file_exists()
aufrufen, welcher
als Parameter der Dateiname mit Pfad übergeben wird und als Rückgabe ein Wert vom Typ Boolean
zurückgibt. Die
Funktion filesize()
erlaubt es, die Dateigröße einer Datei zu ermitteln. Als Parameter wird der Dateiname
übergeben und als Rückgabewert erhalten Sie die Dateigröße oder false
im Fehlerfall.
Dateiinhalt einlesen
Möchten Sie den kompletten Inhalt einer Datei einlesen, so können Sie die Funktion file_get_contents()
verwenden. Als Parameter übergeben Sie dieser den Dateinamen mit Pfad. Die Pfadangabe kann relativ oder absolut sein. Des
Weiteren ist es möglich, eine URL anzugeben, um z. B. den Inhalt einer anderen Seite zu laden. Die Funktion file_get_contents()
gibt als Rückgabewert eine Zeichenkette zurück. Schlägt das Auslesen der Datei fehl, so wird false
zurückgegeben.
Im folgenden Beispiel wird eine Datei eingelesen, an den Zeilenumbrüchen getrennt und anschließend alle Zeilen nacheinander
ausgegeben:
<?php $inhalt = file_get_contents('datei-beispiel.txt'); $zeilen = explode("\r\n", $inhalt); foreach ($zeilen as $zeile) echo $zeile.'<br />'; ?>
Arbeiten mit Datei-Handles
Wollen Sie nur einen Teil einer Datei auslesen oder in eine Datei schreiben, so müssen Sie Datei-Handles verwenden.
Ein Handle (zu Deutsch Griff oder Henkel) ist eine Referenz auf eine Ressource (in diesem Fall eine Datei) des Systems.
Um ein Datei-Handle zu erhalten, müssen wir die Funktion fopen()
aufrufen, welche eine Datei öffnet. Der Funktion
fopen()
werden der Dateiname (ggf. mit Pfad) und ein Modus übergeben. Für den Modus sind einige Kürzel verfügbar,
welche Sie bitte der folgenden Tabelle entnehmen:
Kürzel | Lesen | Schreiben | Dateizeiger | Dateiinhalt | Datei |
---|---|---|---|---|---|
r | ja | nein | Anfang | - | - |
r+ | ja | ja | Anfang | - | - |
w | nein | ja | Anfang | alter Inhalt wird überschrieben | wird ggf. erstellt |
w+ | ja | ja | Anfang | alter Inhalt wird überschrieben | wird ggf. erstellt |
a | nein | ja | Ende | neuer Inhalt wird angehängt | wird ggf. erstellt |
a+ | ja | ja | Ende | neuer Inhalt wird angehängt | wird ggf. erstellt |
Die Funktion fopen()
gibt einen Datei-Handle oder false
zurück, wenn ein Fehler auftritt. Hier ein
Beispiel für den Aufruf der Funktion fopen()
:
<?php $handle = fopen('datei-beispiel.txt', 'r') ?>
Um aus einer Datei (mittels Datei-Handle) zu lesen, gibt es die Funktion fread()
. Der Funktion fread()
werden das Datei-Handle und die Anzahl der zu lesenden Bytes übergeben. Die Funktion gibt eine Zeichenkette oder im Fehlerfall
false
zurück.
<?php $daten = fread($handle, 20); ?>
Das Schreiben in eine Datei erfolgt mittels der Funktion fwrite()
. Der Funktion werden das Datei-Handle,
eine Zeichenkette und optional die Anzahl der zu schreibenden Bytes übergeben. Wird die Anzahl der zu schreibenden Bytes nicht
mit übergeben, so wird die Länge der Zeichenkette bestimmt und diese als Längenangabe verwendet. fwrite()
gibt
die Anzahl der geschriebenen Bytes oder im Fehlerfall false
zurück.
<?php $len = fwrite($handle, $daten); ?>
Die Funktion ftell()
ermöglicht es, die aktuelle Position in dem Datei-Handle, den sogenannten Dateizeiger,
zu ermitteln. Als Rückgabe erhalten Sie die Position in der Datei (Dateianfang entspricht der Position 0). Schlägt die
Funktion fehl, so wird false
zurückgegeben.
<?php $pos = ftell($handle); ?>
So wie der Dateizeiger ausgelesen werden kann, kann der Dateizeiger auch gesetzt werden. Hierfür wird die Funktion fseek()
verwendet, welcher das Datei-Handle und die Dateiposition übergeben werden muss.
<?php fseek($handle, 40); ?>
Möchten Sie prüfen, ob sich der Dateizeiger am Ende befindet, so können Sie die Funktion feof()
aufrufen.
<?php $ende = feof($handle); ?>
Sobald Sie mit einem Datei-Handle fertig sind und es nicht mehr benötigen, sollten Sie es wieder schließen. Hierfür
verwenden Sie die Funktion fclose()
.
<?php fclose($handle); ?>
Im folgenden Beispiel wird ein Teil der Datei ausgelesen und ausgegeben. Zusätzlich wird, bevor die Datei geschlossen wird, die Position des Dateizeigers ausgegeben:
<?php $handle = fopen('datei-beispiel.txt', 'r'); fseek($handle, 42); echo str_replace("\r\n", '<br />', fread($handle, 118)); echo '<br /><br />Position: '.ftell($handle); fclose($handle); ?>
Datei einbinden
Wenn Sie Funktionen oder Objekte in mehrere Dateien aufteilen wollen, so müssen Sie die Möglichkeit haben, Dateien einzubinden.
Eingebundene Dateien müssen nicht zwingend PHP-Code enthalten, sondern können z. B. auch nur HTML-Code enthalten. Befindet sich
in der Datei PHP-Code, so wird dieser vom PHP-Interpreter ausgeführt. Insgesamt gibt es für das Einbinden vier verschiedene
sogenannte Sprachkonstrukte: include
, include_once
, require
und require_once
.
Bei allen Sprachkonstrukten wird nach dem jeweiligen Schlüsselwort der Dateiname mit Pfad (Zeichenkette) und einem
abschließenden Semikolon angegeben. Bei allen vier Sprachkonstrukten ist auch eine alternative Schreibweise wie bei Funktionen
möglich.
<?php include 'datei2.php'; include('datei2.php'); // Entspricht der obigen Zeile ?>
Der Sprachkonstrukt require
verhält sich fast identisch wie include
, nur mit dem Unterschied, dass
wenn die angegebene Datei nicht gefunden wurde oder ein Zugriff auf die Datei nicht möglich ist, ein fataler PHP-Fehler
ausgelöst wird. Das Gleiche gilt für require_once
im Verhältnis zu include_once
. Die Befehle
include_once
und require_once
entsprechen include
und require
mit dem
Unterschied, dass geprüft wird, ob die angegebene Datei bereits eingebunden wurde. Ist dies der Fall, so wird der
Befehl ignoriert.
<?php require 'datei-einbinden-2.php'; echo $a * $b; ?>
datei-einbinden-2.php:
<?php $a = 7; $b = 4; ?>