W3docs

tmpfile()

Die PHP-Funktion tmpfile() erstellt eine temporäre Datei und gibt ein Datei-Handle zurück. In diesem Artikel erfahren Sie mehr über ihre Verwendung.

Einführung

Wenn ein PHP-Skript einen Ort zum Zwischenspeichern von Daten benötigt, die nur für die Dauer der Anfrage relevant sind — ein zu großer Puffer für den Arbeitsspeicher, eine CSV-Datei, die Sie gleich an den Browser streamen, eine Ausgabe aus einem externen Befehl — greifen Sie zu einer temporären Datei. Die Funktion tmpfile() stellt Ihnen eine solche mit einem einzigen Aufruf bereit: Sie erstellt eine eindeutige Datei im temporären Systemverzeichnis, öffnet sie zum Lesen und Schreiben und gibt ein Datei-Handle zurück. Und das Beste: Sie räumt nach sich selbst auf.

Dieses Kapitel behandelt die Syntax, das automatische Bereinigungsverhalten, das tmpfile() besonders macht, wann Sie es gegenüber tempnam() bevorzugen sollten, sowie mehrere ausführbare Beispiele einschließlich einiger häufiger Fallstricke.

Was ist eine temporäre Datei?

Eine temporäre Datei ist eine Datei, die Ihr Programm als Scratch-Bereich verwendet und nicht zu behalten beabsichtigt. Sie befindet sich im temporären Verzeichnis des Betriebssystems (/tmp unter Linux/macOS, C:\Windows\Temp oder dem Pfad in der Umgebungsvariable TEMP unter Windows). Da viele Prozesse dieses Verzeichnis gemeinsam nutzen, benötigen temporäre Dateien eindeutige Namen, damit zwei Skripte sich nicht gegenseitig überschreiben — tmpfile() übernimmt diese Eindeutigkeit für Sie.

Die Funktion tmpfile() verstehen

Die Funktion tmpfile() erstellt eine temporäre Datei mit einem eindeutigen Namen im temporären Systemverzeichnis und öffnet sie zum Lesen und Schreiben im Modus w+ (die Datei beginnt leer, und Sie können sowohl in sie schreiben als auch sie zurücklesen). Sie nimmt keine Parameter entgegen.

Das Hauptmerkmal ist die automatische Bereinigung. Die temporäre Datei wird entfernt, wenn:

  • Sie das Handle mit fclose() schließen, oder
  • das Skript endet und das Handle den Gültigkeitsbereich verlässt.

Dadurch müssen Sie die Datei so gut wie nie selbst löschen. Der Nachteil ist, dass tmpfile() den Dateipfad nicht preisgibt — das Handle ist die einzige Referenz, die Sie erhalten. Wenn Sie einen bekannten Dateinamen benötigen, den Sie an ein anderes Programm übergeben können, verwenden Sie stattdessen tempnam().

Syntax der Funktion tmpfile()

Die Syntax der Funktion tmpfile() lautet wie folgt:

tmpfile(): resource|false

Die Funktion nimmt keine Argumente entgegen und gibt zurück:

  • ein Datei-Handle (resource), das beim Anfang der leeren Datei positioniert ist, bei Erfolg, oder
  • false bei einem Fehler — zum Beispiel, wenn das temporäre Verzeichnis nicht beschreibbar ist.

Prüfen Sie immer den Rückgabewert, bevor Sie das Handle verwenden, da die Übergabe von false an Funktionen wie fwrite() ab PHP 8 einen TypeError auslöst.

Beispiele für die Verwendung von tmpfile()

Beispiel 1: Schreiben, Zurücklesen und automatische Bereinigung

Das häufigste Muster: eine temporäre Datei öffnen, in sie schreiben, den Zeiger zurücksetzen und sie zurücklesen. Beachten Sie den Aufruf von rewind() — nach dem Schreiben befindet sich der interne Zeiger am Ende der Daten, sodass fread() ohne Zurücksetzen einen leeren String zurückgeben würde.

<?php

$handle = tmpfile();
if ($handle === false) {
    die('Failed to create temporary file');
}

fwrite($handle, 'Example data');
rewind($handle);                  // move pointer back to the beginning
echo fread($handle, 1024);        // read up to 1024 bytes
fclose($handle);                  // closing also deletes the file

Ausgabe:

Example data

Die Datei wird in dem Moment entfernt, in dem fclose() ausgeführt wird, sodass nichts manuell bereinigt werden muss.

Beispiel 2: Den echten Pfad der temporären Datei ermitteln

Obwohl tmpfile() den Dateinamen verbirgt, können Sie ihn über die Metadaten des Streams mit stream_get_meta_data() abrufen. Dies ist praktisch für die Protokollierung oder das Debuggen — zum Beispiel um zu bestätigen, dass die Datei wirklich verschwindet.

<?php

$handle = tmpfile();
$meta   = stream_get_meta_data($handle);
$path   = $meta['uri'];

echo 'Temp file exists before close: ';
echo file_exists($path) ? 'yes' : 'no';
echo "\n";

fclose($handle);

echo 'Temp file exists after close:  ';
echo file_exists($path) ? 'yes' : 'no';
echo "\n";

Ausgabe:

Temp file exists before close: yes
Temp file exists after close:  no

Beispiel 3: CSV-Zeilen puffern, bevor sie gesendet werden

Ein realistischer Anwendungsfall: Erstellen Sie eine CSV-Datei in einer temporären Datei mit fputcsv() und lesen Sie dann alles zurück, um sie zurückzugeben oder zu streamen. Dadurch werden große Datenmengen aus dem Arbeitsspeicher ferngehalten, während Sie sie trotzdem Zeile für Zeile zusammenstellen können.

<?php

$rows = [
    ['Name', 'Role'],
    ['Ada', 'Engineer'],
    ['Linus', 'Maintainer'],
];

$handle = tmpfile();
foreach ($rows as $row) {
    fputcsv($handle, $row);
}

rewind($handle);
echo stream_get_contents($handle);   // read everything from the pointer to EOF
fclose($handle);

Ausgabe:

Name,Role
Ada,Engineer
Linus,Maintainer

tmpfile() vs. tempnam()

Beide erstellen temporäre Dateien, lösen aber unterschiedliche Probleme:

Aspekttmpfile()tempnam()
Gibt zurückEin offenes Datei-HandleEinen Dateinamen (string)
Öffnet die Datei?Ja (w+)Nein — Sie rufen fopen() selbst auf
Automatisches Löschen?Ja, beim Schließen / SkriptendeNein — Sie müssen unlink() aufrufen
Kennen Sie den Pfad?Nur über stream_get_meta_data()Ja, direkt

Faustregel: Verwenden Sie tmpfile() für in sich geschlossene Scratch-Daten innerhalb eines Skripts; verwenden Sie tempnam(), wenn Sie eine benannte Datei benötigen, die Sie an einen anderen Prozess übergeben oder nach der Anfrage behalten möchten.

Häufige Fallstricke

  • rewind() vergessen. Nach dem Schreiben befindet sich der Zeiger am Ende. Lesen ohne Zurücksetzen gibt nichts zurück.
  • Rückgabewert voraussetzen. In einem schreibgeschützten temporären Verzeichnis gibt tmpfile() false zurück; prüfen Sie dies immer.
  • Erwarten, dass die Datei erhalten bleibt. Sobald das Handle geschlossen wird, ist die Datei verschwunden — kopieren Sie die Daten heraus (mit fopen() in einen dauerhaften Pfad, file_put_contents() usw.), wenn Sie sie behalten müssen.

Fazit

Die Funktion tmpfile() ist der einfachste Weg, eine private, automatisch bereinigbare Scratch-Datei in PHP zu erhalten. Sie gibt Ihnen ein Lese-Schreib-Handle, platziert die Datei sicher im temporären Systemverzeichnis und löscht sie in dem Moment, in dem Sie das Handle schließen oder das Skript endet — ohne manuellen Wartungsaufwand. Greifen Sie darauf zurück, wenn Sie kurzlebigen Speicher benötigen und den Dateinamen nicht kennen müssen; greifen Sie auf tempnam() zurück, wenn Sie ihn benötigen.

Übung

Übung
Was ist die Funktion von tmpfile() in PHP?
Was ist die Funktion von tmpfile() in PHP?
Was this page helpful?