(PHP 4, PHP 5, PHP 7)
fopen — Öffnet eine Datei oder URL
$filename
, string $mode
[, bool $use_include_path
= FALSE
[, resource $context
]] ) : resource
fopen() bindet eine benannte Ressource, die durch
filename
spezifiziert wurde, an einen Stream.
filename
Hat filename
die Form "schema://..."
wird angenommen, dass es sich hier um einen URL handelt und PHP sucht
nach einem Protokollhandler (auch als Wrapper bekannt) für dieses
Schema. Sind keine Wrapper für dieses Protokoll registriert, gibt
PHP als Hilfe zum Verfolgen potentieller Probleme in Ihrem Skript
einen Hinweis aus und setzt dann weiter fort, als wenn
filename
eine reguläre Datei spezifiziert.
Ist PHP zu dem Schluss gekommen, dass filename
eine lokale Datei spezifiziert, wird es versuchen, einen Stream
an dieser Datei zu öffnen. Die Datei muss für PHP zugreifbar sein,
weshalb Sie sicherstellen müssen, dass die Dateirechte diesen
Zugriff ermöglichen. Wenn Sie
open_basedir aktiviert haben,
können weitere Einschränkungen zutreffen.
Kam PHP zum Schluss, dass es sich bei filename
um ein registriertes Protokoll handelt, und ist dieses Protokoll
als ein Netzwerk URL registriert, prüft PHP, ob
allow_url_fopen aktiviert
ist. Ist es nicht aktiviert, gibt PHP eine Warnung aus, und der
Aufruf von fopen wird scheitern.
Hinweis:
Die Liste der unterstützten Protokolle ist unter Unterstützte Protokolle und Wrapper zu finden. Einige Protokolle (auch als
Wrapper
bezeichnet) unterstützencontext
und/oder php.ini Optionen. Auf der jeweiligen Seite für das genutzte Potokoll ist eine Liste der Optionen, die gesetzt werden können, aufgeführt (z.B. php.ini Wertuser_agent
genutzt vomhttp
Wrapper).
Es ist darauf zu achten, unter Windows alle Backslash-Zeichen, die in Pfaden genutzt werden, zu maskieren oder Schrägstriche (Slash) zu nutzen.
<?php
$handle = fopen("c:\\verzeichnis\\ressource.txt", "r");
?>
mode
Der mode
Parameter spezifiziert den Zugriffstyp,
der vom Stream gefordert wird. Es kann einer der folgenden sein:
mode |
Beschreibung |
---|---|
'r' |
Nur zum Lesen geöffnet; platziere Dateizeiger auf Dateianfang. |
'r+' |
Zum Lesen und Schreiben geöffnet; platziere Dateizeiger auf Dateianfang. |
'w' |
Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateianfang und kürze die Datei auf eine Länge von 0. Existiert die Datei nicht, versuche, diese zu erzeugen. |
'w+' |
Zum Schreiben und Lesen geöffnet; platziere Dateizeiger auf Dateianfang und kürze die Datei auf eine Länge von 0. Existiert die Datei nicht, versuche, diese zu erzeugen. |
'a' |
Nur zum Schreiben geöffnet; platziere Dateizeiger auf Dateiende. Existiert die Datei nicht, versuche, diese zu erzeugen. In diesem Modus ist fseek() wirkungslos; beim Schreiben wird immer angehängt. |
'a+' |
Zum Schreiben und Lesen geöffnet; platziere Dateizeiger auf Dateiende. Existiert die Datei nicht, versuche, diese zu erzeugen. In diesem Modus wirkt sich fseek() nur auf die Leseposition aus; beim Schreiben wird immer angehängt. |
'x' |
Erzeuge und Öffne nur zum Schreiben; platziere Dateizeiger auf
Dateianfang. Falls die Datei schon existiert, wird der
fopen() Aufruf fehlschlagen durch Rückgabe von
FALSE und dem Auslösen eines Fehlers der Stufe
E_WARNING . Existiert die Datei nicht,
versuche, diese zu erzeugen. Dies ist zur Angabe der
O_EXCL|O_CREAT Flags für den darunterliegenden
open(2) System Aufruf äquivalent.
|
'x+' |
Erzeuge und Öffne zum Schreiben und Lesen; ansonsten ist das
Verhalten gleich wie bei 'x' .
|
'c' |
Öffne Datei nur zum Schreiben. Wenn die Datei nicht existiert,
wird diese erzeugt. Wenn sie existiert, wird sie weder gekürzt (im
Gegensatz zu 'w' ), noch schlägt der Aufruf
dieser Funktion fehl (wie dies mit 'x' der Fall
ist). Der Dateizeiger wird auf den Dateianfang platziert. Dies
kann nützlich sein, wenn man eine "beratende" (kooperative) Sperre
erhalten möchte (siehe flock()) bevor man
versucht, die Datei zu ändern, da die Nutzung
von 'w' die Datei kürzen könnte, bevor die
Sperre erhalten wurde (falls Kürzen gewünscht ist, kann
ftruncate() genutzt werden, nachdem die Sperre
angefragt wurde).
|
'c+' |
Öffne Datei zum Lesen und Schreiben; ansonsten ist das
Verhalten gleich wie bei 'c' .
|
'e' |
Setzt das close-on-exec Flag für den geöffneten Datei-Descriptor. Nur verfügbar, wenn PHP auf POSIX.1-2008 konformen System kompiliert wurde. |
Hinweis:
Verschiedene Betriebssysteme haben unterschiedliche Konventionen für das Zeilenende. Wenn Sie eine Textdatei schreiben und einen Zeilenumbruch einfügen möchten, müssen Sie das/die korrekte(n) Zeilenendszeichen für Ihr Betriebssystem nutzen. Unix-basierte Systeme nutzen
\n
als Zeilenendszeichen, Windows-basierte Systeme nutzen\r\n
als Zeilenendszeichen und Macintosh-basierte Systeme (Mac OS Classic) nutzten\r
als Zeilenendszeichen.Wenn Sie die falschen Zeilenendszeichen beim Schreiben Ihrer Dateien nutzen, kann es sein, dass andere Anwendungen, die diese Dateien öffnen, "seltsam aussehen".
Windows bietet einen Text-Mode translations Flag (
't'
) an, der transparent\n
zu\r\n
übersetzt, wenn mit der Datei gearbeitet wird. Andererseits kann auch'b'
genutzt werden, um Binärmode zu erzwingen, der die Daten nicht übersetzt. Um diese Flags zu nutzen, wird entweder'b'
oder't'
als das letzte Zeichen desmode
Parameters angegeben.Der Standard Übersetzungsmodus ist
'b'
. Es kann der't'
Modus genutzt werden, wenn mit Textdateien gearbeitet wird, und\n
verwendet wird, um die Zeilenenden im Skript zu begrenzen, aber erwartet wird, dass die Dateien mit Anwendungen wie etwa alten Versionen von Notepad lesbar sind. Ansonsten sollte'b'
genutzt werden.Wird beim Arbeiten mit binären Dateien das 't' Flag angegeben, können seltsame Probleme mit den Daten auftreten, einschließlich zerstörter Bild Dateien und merkwürdiger Probleme mit
\r\n
Zeichen.
Hinweis:
Aus Portabilitätsgründen wird ebenfalls dringend empfohlen, dass Code umgeschrieben wird, der den
't'
Modus nutzt oder sich darauf verlässt, so dass die korrekten Zeilenendungen und der'b'
Modus stattdessen genutzt werden.
use_include_path
Der optionale dritte Parameter use_include_path
kann auf '1' oder TRUE
gesetzt werden, wenn sie wollen, dass nach der
Datei auch im include_path
gesucht wird.
context
Hinweis: Die Kontext-Unterstützung gibt es seit PHP 5.0.0. Eine Beschreibung von
Kontexten
finden Sie unter Streams.
Gibt bei Erfolg eine Dateizeiger Ressource zurück. Im Fehlerfall wird FALSE
zurückgegeben.
Im Fehlerfall wird eine E_WARNING
ausgegeben.
Version | Beschreibung |
---|---|
7.0.16, 7.1.2 |
Die 'e' Option wurde hinzugefügt.
|
Beispiel #1 fopen() Beispiele
<?php
$handle = fopen("/home/rasmus/file.txt", "r");
$handle = fopen("/home/rasmus/file.gif", "wb");
$handle = fopen("http://www.example.com/", "r");
$handle = fopen("ftp://user:password@example.com/somefile.txt", "w");
?>
Bei SSL-Verbindungen zusammen
mit Microsoft IIS hält sich dieser Webserver nicht an das Protokoll und
schließt die Verbindung ohne ein close_notify
zu senden.
PHP quittiert dieses Fehlverhalten mit "SSL: Fatal Protocol Error", wenn das
Ende der Daten erreicht ist. Eine mögliche Lösung besteht darin, den Level von
error_reporting herabzusetzten und
Warnings auszuschließen. PHP kann fehlerhafte IIS-Serversoftware
erkennen, wenn Sie einen Stream mit dem https://
-Wrapper öffnen,
und unterdrückt die Warnung für Sie. Falls Sie fsockopen()
benutzen, um einen ssl://
-Socket zu öffnen, müssen Sie selbst
dafür Sorge tragen, die Warnung zu erkennen und diese zu unterdrücken.
Hinweis:
Treten beim Lesen und Schreiben von Dateien Probleme auf, und die die Server Modul Version von PHP wird verwendet, ist sicherzustellen, dass die Dateien und Verzeichnisse, die genutzt werden, für den Server Prozess zugänglich sind.
Hinweis:
Diese Funktion kann ebenfalls gelingen, wenn
filename
ein Verzeichnis ist. Im Zweifelsfall sollte vor dem Aufruf von fopen() mit is_dir() geprüft werden, obfilename
eine Datei oder ein Verzeichnis ist.