Auf einem Webserver laufen oft mehrere Anfragen gleichzeitig. Wenn ein Skript Daten temporär in eine Datei schreiben muss, darf kein fester Dateiname verwendet werden, weil sich parallele Prozesse sonst gegenseitig überschreiben würden. PHP bietet mit tempnam() und tmpfile() zwei Funktionen, die dieses Problem lösen.
tempnam(): Eindeutigen Dateinamen erzeugen
Die Funktion tempnam() erstellt eine leere Datei mit einem eindeutigen Namen und gibt den vollständigen Pfad zurück. Die Syntax lautet:
<?php
$tmpDatei = tempnam(sys_get_temp_dir(), 'mein_prefix_');
echo $tmpDatei;
/* z.B.: /tmp/mein_prefix_X3hG7k */
?>
Der erste Parameter gibt das Verzeichnis an, der zweite ein Präfix für den Dateinamen. Mit sys_get_temp_dir() wird automatisch das Temp-Verzeichnis des Systems ermittelt, was portabler ist als ein fester Pfad.
Wichtig: Die Funktion tempnam() legt die Datei tatsächlich an (als leere Datei mit 0 Bytes). Der Name wird nicht nur generiert, sondern die Datei existiert danach auf der Festplatte. Dadurch ist garantiert, dass kein anderer Prozess den gleichen Namen erhält.
Praxisbeispiel: Daten zwischenspeichern
Ein typischer Einsatz ist das Zwischenspeichern von Daten, etwa beim Erzeugen eines CSV-Exports:
<?php
$tmpDatei = tempnam(sys_get_temp_dir(), 'csv_');
/* Daten in die temporaere Datei schreiben */
$handle = fopen($tmpDatei, 'w');
fputcsv($handle, ['Name', 'E-Mail']);
fputcsv($handle, ['Max Mustermann', 'max@example.com']);
fputcsv($handle, ['Erika Muster', 'erika@example.com']);
fclose($handle);
/* Datei zum Download anbieten */
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename="export.csv"');
readfile($tmpDatei);
/* Temporaere Datei aufraeumen */
unlink($tmpDatei);
?>
Nach der Verwendung wird die temporäre Datei mit unlink() gelöscht. Das Aufräumen ist wichtig, weil tempnam()-Dateien nicht automatisch entfernt werden.
tmpfile(): Automatisch aufräumende Alternative
Wer sich nicht um das Löschen kümmern möchte, kann tmpfile() verwenden. Diese Funktion erstellt eine temporäre Datei und gibt direkt einen Datei-Handle zurück. Die Datei wird automatisch gelöscht, sobald der Handle geschlossen wird oder das Skript endet:
<?php
$handle = tmpfile();
fwrite($handle, 'Temporaere Daten');
/* Position zuruecksetzen und lesen */
rewind($handle);
echo fread($handle, 1024);
/* Datei wird beim Schliessen automatisch geloescht */
fclose($handle);
?>
Wann welche Funktion nutzen?
tempnam() eignet sich, wenn der Dateipfad an andere Funktionen weitergegeben werden muss, etwa an readfile() oder externe Programme. tmpfile() ist die bessere Wahl für kurzlebige Daten innerhalb eines einzelnen Skripts, weil die Aufräumlogik automatisch funktioniert und keine vergessenen Dateien zurückbleiben.