fopen
(PHP 4, PHP 5, PHP 7, PHP 8)
fopen — Öffnet eine Datei oder URL
Beschreibung
string
$filename
,string
$mode
,bool
$use_include_path
= false
,?resource
$context
= null
): resource|false
fopen() bindet eine benannte Ressource, die durch
filename
spezifiziert wurde, an einen Stream.
Parameter-Liste
-
filename
-
Wenn
filename
die Form "schema://..." hat, wird angenommen, dass es sich hier um eine 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 einen Hinweis aus, um Ihnen zu helfen, mögliche Probleme in Ihrem Skript zu erkennen, und fährt dann fort, als obfilename
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 gelten.Kam PHP zum Schluss, dass es sich bei
filename
um ein registriertes Protokoll handelt, und ist dieses Protokoll als eine 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 scheitert.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. Eine Liste der verfügbaren Optionen finden Sie auf den Handbuchseiten zum verwendeten Protokoll (z. B. die php.ini-Optionuser_agent
, die vomhttp
-Wrapper verwendet wird).Es ist darauf zu achten, unter Windows alle Backslash-Zeichen, die in Pfaden genutzt werden, zu maskieren oder Schrägstriche (Slashes) zu nutzen.
<?php
$handle = fopen("c:\\verzeichnis\\ressource.txt", "r");
?> -
mode
-
Der Parameter
mode
spezifiziert den Zugriffstyp, der vom Stream gefordert wird. Es kann einer der folgenden sein:Eine Liste der möglichen Modi von fopen() mittels mode
mode
Beschreibung 'r'
Nur zum Lesen geöffnet; platziere den Dateizeiger auf den Dateianfang. 'r+'
Zum Lesen und Schreiben geöffnet; platziere den Dateizeiger auf den Dateianfang. 'w'
Nur zum Schreiben geöffnet; platziere den Dateizeiger auf den 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; ansonsten verhält es sich wie 'w'
..'a'
Nur zum Schreiben geöffnet; platziere den Dateizeiger auf das 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 den Dateizeiger auf das 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 den Dateizeiger auf den Dateianfang. Falls die Datei schon existiert, wird der fopen()-Aufruf fehlschlagen, indem er false
zurückgibt und dem einen Fehler der StufeE_WARNING
auslöst. Existiert die Datei nicht, versuche, diese zu erzeugen. Dies ist zur Angabe derO_EXCL|O_CREAT
-Flags für den darunterliegendenopen(2)
-Systemaufruf äquivalent.'x+'
Erzeuge und öffne zum Schreiben und Lesen; ansonsten ist das Verhalten gleich wie bei 'x'
.'c'
Öffne die 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 das 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 Flag close-on-exec für den geöffneten Datei-Deskriptor. 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) Zeilenendezeichen für Ihr Betriebssystem nutzen. Unix-basierte Systeme nutzen
\n
als Zeilenendezeichen, Windows-basierte Systeme nutzen\r\n
als Zeilenendezeichen und Macintosh-basierte Systeme (Mac OS Classic) nutzten\r
als Zeilenendezeichen.Wenn Sie die falschen Zeilenendezeichen beim Schreiben Ihrer Dateien nutzen, kann es sein, dass andere Anwendungen, die diese Dateien öffnen, "seltsam aussehen".
Windows bietet ein Übersetzungs-Flag (
't'
) fur den Textmodus an, das\n
transparent in\r\n
übersetzt, wenn mit der Datei gearbeitet wird. Andererseits kann auch'b'
genutzt werden, um den Binärmodus zu erzwingen, der die Daten nicht übersetzt. Um diese Flags zu nutzen, wird entweder'b'
oder't'
als das letzte Zeichen des Parametersmode
angegeben.Der Standard-Übersetzungsmodus ist
'b'
. Es kann der Modus't'
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 Flag 't' angegeben, können seltsame Probleme mit den Daten auftreten, einschließlich zerstörter Bilddateien und merkwürdiger Probleme mit
\r\n
-Zeichen.Hinweis:
Aus Portabilitätsgründen wird ebenfalls dringend empfohlen, dass Code, der den Modus
't'
nutzt oder sich darauf verlässt, so umgeschrieben wird, dass stattdessen die korrekten Zeilenendungen und der Modus'b'
genutzt werden.Hinweis: Der Parameter
mode
wird bei den Stream-Wrappern php://output, php://input, php://stdin, php://stdout, php://stderr und php://fd ignoriert. -
use_include_path
-
Der optionale dritte Parameter
use_include_path
kann auf '1' odertrue
gesetzt werden, wenn sie wollen, dass nach der Datei auch im include_path gesucht wird. -
context
-
Eine Stream-Kontext-Ressource.
Rückgabewerte
Gibt bei Erfolg eine Dateizeiger-Ressource zurück. Bei einem Fehler wird false
zurückgegeben.
Fehler/Exceptions
Im Fehlerfall wird eine E_WARNING
ausgegeben.
Changelog
Version | Beschreibung |
---|---|
7.0.16, 7.1.2 |
Die Option 'e' wurde hinzugefügt.
|
Beispiele
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");
?>
Anmerkungen
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:
Wenn die Servermodul-Version von PHP wird verwendet wird und beim Lesen und Schreiben von Dateien Probleme auftreten, ist sicherzustellen, dass die Dateien und Verzeichnisse, die genutzt werden, für den Server-Prozess zugänglich sind.
Hinweis:
Diese Funktion kann auch dann funktionieren, 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.
Siehe auch
- Unterstützte Protokolle und Wrapper
- fclose() - Schließt einen offenen Dateizeiger
- fgets() - Liest eine Zeile von der Position des Dateizeigers
- fread() - Liest Binärdaten aus einer Datei
- fwrite() - Binär-sicheres Dateischreiben
- fsockopen() - Stellt eine Internet- oder Unix-Domain-Socket-Verbindung her
- file() - Liest eine komplette Datei in ein Array
- file_exists() - Prüft, ob eine Datei oder ein Verzeichnis existiert
- is_readable() - Prüft, ob eine Datei existiert und lesbar ist
- stream_set_timeout() - Set timeout period on a stream
- popen() - Öffnet einen Dateizeiger für einen Prozess
- stream_context_create() - Creates a stream context
- umask() - Changes the current umask
- SplFileObject