W3docs

tempnam()

Die PHP-Funktion tempnam() erstellt eine temporäre Datei mit eindeutigem Namen und gibt den vollständigen Pfad zurück. Nützlich für PHP-Skripte.

Einführung

tempnam() erstellt eine temporäre Datei mit einem eindeutigen Namen und gibt den vollständigen Pfad zu ihr zurück. Entscheidend ist dabei, dass die Funktion nicht nur einen Namen erzeugt — sie erstellt die Datei tatsächlich auf dem Datenträger (leer, mit dem Modus 0600), sodass es keine Race Condition gibt, bei der zwei Prozesse denselben Namen wählen könnten. Verwenden Sie diese Funktion, wenn Ihr Skript temporären Speicherplatz auf dem Datenträger benötigt: zum Puffern eines Uploads, zum Erstellen eines Berichts vor dem Streamen oder zum Übergeben eines Pfades an einen externen Befehl.

Dieses Kapitel behandelt die Syntax, den Rückgabewert, den tatsächlichen Speicherort der Datei, häufige Fallstricke im Produktionseinsatz und die Bereinigung danach.

Syntax

tempnam(string $directory, string $prefix): string|false
ParameterBeschreibung
$directoryDas Verzeichnis, in dem die Datei erstellt werden soll. Wenn es nicht existiert oder nicht beschreibbar ist, greift PHP auf das System-Temp-Verzeichnis zurück (sys_get_temp_dir()).
$prefixEin Präfix für den generierten Dateinamen. Auf den meisten Systemen werden nur die ersten 63 Zeichen verwendet; unter Windows nur die ersten 3.

Rückgabewert: der vollständige Pfad zur neu erstellten Datei (z. B. /tmp/example_aB3xYz) oder false bei einem Fehler.

Eine temporäre Datei erstellen

<?php

$tempFile = tempnam(sys_get_temp_dir(), 'example_');
echo $tempFile;
// e.g. /tmp/example_8gKq2P

sys_get_temp_dir() gibt das Temp-Verzeichnis des Betriebssystems zurück (/tmp unter Linux/macOS, den TEMP-Pfad unter Windows), was portabler ist als das Fest-Codieren von /tmp.

In die Datei schreiben und aus ihr lesen

tempnam() gibt nur einen Pfad zu einer leeren Datei zurück — Sie müssen sie noch öffnen, um Daten hineinzuschreiben:

<?php

$tempFile = tempnam(sys_get_temp_dir(), 'report_');

// Write some data
file_put_contents($tempFile, "Line 1\nLine 2\n");

// Read it back
echo file_get_contents($tempFile);
// Line 1
// Line 2

// Clean up when you're done
unlink($tempFile);

Da tempnam() die Datei nicht für Sie löscht, entfernen Sie sie stets mit unlink(), sobald Sie fertig sind — andernfalls häufen sich temporäre Dateien an.

Das Fallback-Verhalten

Wenn $directory nicht existiert oder nicht beschreibbar ist, schlägt tempnam() nicht direkt fehl — es erstellt die Datei stillschweigend im System-Temp-Verzeichnis. Das bedeutet, dass der zurückgegebene Pfad möglicherweise nicht im angegebenen Verzeichnis liegt. Gehen Sie daher nie vom Speicherort aus:

<?php

// /no/such/dir doesn't exist
$tempFile = tempnam('/no/such/dir', 'data_');

// File is created in sys_get_temp_dir(), not /no/such/dir
echo dirname($tempFile) === sys_get_temp_dir() ? 'fell back' : $tempFile;
// fell back

Verwenden Sie für alle nachfolgenden Operationen immer den zurückgegebenen Pfad, anstatt ihn aus $directory und $prefix neu zu konstruieren.

tempnam() vs. tmpfile()

Beide Funktionen erstellen eine eindeutige temporäre Datei, dienen jedoch unterschiedlichen Zwecken:

  • tempnam() gibt einen Pfad (string) zurück. Die Datei bleibt bestehen, bis Sie unlink() aufrufen, und Sie können den Pfad an andere Funktionen oder externe Programme übergeben.
  • tmpfile() gibt ein offenes Datei-Handle zurück, und die Datei wird automatisch gelöscht, wenn das Handle geschlossen wird oder das Skript endet. Verwenden Sie diese Funktion, wenn Sie nur das Handle benötigen und eine automatische Bereinigung wünschen.

Greifen Sie auf tempnam() zurück, wenn etwas anderes den Dateinamen benötigt; greifen Sie auf tmpfile() zurück, wenn Sie nur ein selbst-bereinigendes Scratch-Handle brauchen.

Häufige Fallstricke

  • Die Datei wird erstellt. Die Datei existiert nach dem Aufruf bereits (leer), daher ist file_exists() auf dem Ergebnis immer wahr. Um einen Fehler zu erkennen, vergleichen Sie das Ergebnis stattdessen mit false.
  • Immer unlink aufrufen. Temporäre Dateien werden nicht automatisch entfernt. Verbinden Sie jedes tempnam() mit einem unlink(), idealerweise in einem finally-Block.
  • Dem Verzeichnis nicht vertrauen. Aufgrund des Fallback-Verhaltens liegt die Datei möglicherweise nicht dort, wo Sie es angegeben haben. Verwenden Sie den zurückgegebenen Pfad.
  • Das Präfix wird abgeschnitten. Lange Präfixe werden gekürzt (3 Zeichen unter Windows). Verlassen Sie sich daher nicht darauf, dass das vollständige Präfix im Namen vorhanden ist.

Fazit

tempnam() erstellt sicher eine eindeutig benannte, leere temporäre Datei und gibt ihren Pfad zurück. Denken Sie daran, dass die Funktion die Datei erstellt (nicht nur einen Namen), möglicherweise auf das System-Temp-Verzeichnis zurückgreift und sich niemals selbst bereinigt — arbeiten Sie daher immer mit dem zurückgegebenen Pfad und rufen Sie unlink() auf, wenn Sie fertig sind. Wenn Sie nur ein selbst-löschendes Handle benötigen, bevorzugen Sie stattdessen tmpfile().

Übung

Übung
Was macht die Funktion tempnam() in PHP?
Was macht die Funktion tempnam() in PHP?
Was this page helpful?