fclose()
Die Funktion fclose() in PHP schließt einen geöffneten Dateizeiger und ist essenziell für die Ressourcenverwaltung in Skripten.
Einführung in die PHP-Funktion fclose()
Die Funktion fclose() schließt einen Dateizeiger, der zuvor mit fopen() geöffnet wurde. Ein Dateizeiger (auch Handle oder Stream-Ressource genannt) ist der Wert, den PHP beim Öffnen einer Datei zurückgibt; jede Lese- und Schreiboperation verwendet ihn, um die aktuelle Position in der Datei zu verfolgen.
Das Schließen eines Handles nach der Verwendung ist aus zwei Gründen wichtig:
- Es leert den Schreibpuffer. PHP und das Betriebssystem schreiben nicht zwingend jeden Byte sofort auf die Festplatte – sie halten Daten aus Leistungsgründen in einem Puffer.
fclose()erzwingt das Schreiben aller gepufferten Ausgaben, sodass eine vergessene Datei möglicherweise die letzten Bytes verliert. - Es gibt Systemressourcen frei. Jede geöffnete Datei belegt einen Dateideskriptor des Betriebssystems. Ein lang laufendes Skript (oder eine Schleife, die Dateien öffnet, ohne sie zu schließen) kann das Deskriptor-Limit ausschöpfen und mit „Too many open files" fehlschlagen.
PHP schließt alle noch geöffneten Handles automatisch, wenn das Skript endet, sodass in einem kurzen Skript selten Daten verloren gehen. Dennoch sollten Handles explizit geschlossen werden – insbesondere in Schleifen und lang laufenden Prozessen –, damit Ressourcen so früh wie möglich freigegeben werden.
Syntax
fclose(resource $stream): bool$stream— der geöffnete Dateizeiger, den Sie schließen möchten.
Parameter
Die Funktion fclose() erwartet einen erforderlichen Parameter:
$stream: Der Dateizeiger, den Sie schließen möchten. Es muss sich um eine gültige, geöffnete Ressource handeln, die vonfopen(),fsockopen(),popen()oder einer ähnlichen Funktion zurückgegeben wurde. Das Übergeben einer ungültigen oder bereits geschlossenen Ressource löst einenTypeError(PHP 8+) oder eine Warnung (PHP 7) aus, und die Funktion gibtfalsezurück.
Rückgabewerte
Gibt bei Erfolg true und bei einem Fehler false zurück.
Beispiele
Beispiel 1: Datei öffnen, beschreiben und schließen
Das gebräuchlichste Muster ist, eine Datei zu öffnen, mit ihr zu arbeiten und sie dann zu schließen. Das Schließen leert den gepufferten Text auf die Festplatte:
In eine Datei schreiben und das Handle schließen
<?php
$handle = fopen("notes.txt", "w"); // open for writing (creates/empties the file)
fwrite($handle, "Hello, fclose!\n");
fclose($handle); // flush + release the handle
echo "File written and closed.";Ausgabe:
File written and closed.Beispiel 2: Immer prüfen, ob die Datei geöffnet wurde
fopen() gibt false zurück, wenn die Datei nicht geöffnet werden kann (fehlende Datei, keine Berechtigung). Das Schließen von false ist ein Fehler, daher sollte das Handle zuerst geprüft werden:
Schutz vor einem fehlgeschlagenen Öffnen
<?php
$handle = fopen("data.txt", "r");
if ($handle === false) {
echo "Could not open the file.";
} else {
// ... read from the file ...
fclose($handle);
echo "Done.";
}Beispiel 3: In einer Schleife schließen
Wenn viele Dateien verarbeitet werden, sollte jedes Handle so bald wie möglich geschlossen werden, damit sich die Deskriptoren nicht anhäufen:
Jedes Handle innerhalb der Schleife schließen
<?php
$files = ["a.txt", "b.txt", "c.txt"];
foreach ($files as $name) {
$handle = fopen($name, "r");
if ($handle !== false) {
// ... process the file ...
fclose($handle); // closed before the next iteration opens another
}
}Beispiel 4: Den Rückgabewert prüfen
In Code, bei dem ein fehlgeschlagenes Schließen relevant ist (z. B. beim Schreiben in einen Netzwerk-Stream), sollte der Rückgabewert ausgewertet werden:
Ein fehlgeschlagenes Schließen behandeln
<?php
$handle = fopen("report.txt", "w");
fwrite($handle, "Generated report\n");
if (fclose($handle) === false) {
echo "Failed to close the file — data may not have been saved.";
} else {
echo "File saved successfully.";
}Häufige Fallstricke
- Kein Handle nach dem Schließen verwenden. Sobald
fclose()ausgeführt wurde, ist die Ressource ungültig; ein erneuter Aufruf vonfread(),fwrite()oderfclose()darauf schlägt fehl. - Ein
fclose()profopen(). Das zweimalige Schließen desselben Handles löst beim zweiten Aufruf einen Fehler aus. fclose()löscht die Datei nicht. Es wird lediglich der Zeiger freigegeben. Verwenden Sieunlink(), um eine Datei vom Datenträger zu entfernen.- Automatisches Schließen ist kein Freifahrtschein. Das automatische Schließen durch PHP am Ende eines Skripts ist für kleine Skripte in Ordnung, aber eine Schleife, die ohne Schließen öffnet, kann das Dateideskriptor-Limit des Betriebssystems erreichen, lange bevor das Skript endet.
Verwandte Funktionen
fopen()— eine Datei öffnen und das Handle erhalten, dasfclose()später schließt.fwrite()— Daten in ein geöffnetes Handle schreiben.fread()/fgets()— aus einem geöffneten Handle lesen.feof()— prüfen, ob das Ende der Datei erreicht wurde.PHP File Handling— der umfassendere Überblick über die Arbeit mit Dateien.
Fazit
fclose() schließt einen geöffneten Dateizeiger, leert gepufferte Schreibvorgänge und gibt die zugrunde liegende Systemressource frei. Obwohl PHP Handles automatisch schließt, wenn ein Skript endet, hält das explizite Schließen – insbesondere in Schleifen und lang laufenden Skripten – die Dateideskriptoren frei und stellt sicher, dass die Daten auf die Festplatte gelangen. Paaren Sie jedes fopen() mit einem fclose() und schützen Sie sich vor einem fehlgeschlagenen Öffnen, bevor Sie lesen, schreiben oder schließen.