Signatur
Beschreibung
SplTempFileObject erweitert SplFileObject und arbeitet mit einem temporären Puffer, der entweder ausschließlich im Arbeitsspeicher (memory) oder – sobald ein konfigurierbarer Schwellenwert überschritten wird – in einer echten temporären Datei auf der Festplatte liegt. Die Klasse verwendet intern php://temp bzw. php://memory als Stream-Ressource.
Der Konstruktor akzeptiert einen optionalen maximalen Speicher-Parameter (max_memory). Solange der Inhalt des Puffers diese Größe nicht überschreitet, werden alle Daten im RAM gehalten. Wächst der Inhalt darüber hinaus, wechselt PHP transparent zu einer temporären Datei. Bei einem negativen Wert wird ausschließlich php://memory verwendet, d. h. der Puffer verbleibt immer im Arbeitsspeicher.
SplTempFileObject ist sinnvoll, wenn man CSV-Zeilen, Log-Einträge oder andere strukturierte Daten zeilenweise verarbeiten möchte, ohne eine persistente Datei anlegen zu müssen – zum Beispiel beim Aufbau von CSV-Antworten für HTTP-Downloads oder beim Puffern von Ausgaben in Unit-Tests.
Da die Klasse alle Methoden von SplFileObject erbt, stehen Methoden wie fwrite(), fgetcsv(), rewind(), current() und seek() vollständig zur Verfügung.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $max_memory | int | 2097152 | Maximale Anzahl Bytes, die im Arbeitsspeicher gehalten werden (Standard: 2 MB = 2·1024·1024). Bei Überschreitung wird in eine temporäre Datei ausgelagert. Ein negativer Wert erzwingt ausschließlich die Nutzung von php://memory. |
Rückgabewert
Beispiele
CSV-Daten in Arbeitsspeicher schreiben und wieder auslesen
<?php
$tmp = new SplTempFileObject();
// CSV-Zeilen schreiben
$tmp->fputcsv(['Name', 'Alter', 'Stadt']);
$tmp->fputcsv(['Anna', 28, 'Berlin']);
$tmp->fputcsv(['Bob', 35, 'Hamburg']);
// Zurück an den Anfang
$tmp->rewind();
// Zeilen lesen
foreach ($tmp as $row) {
// fgetcsv-Flag setzen, damit CSV-Parsing aktiv ist
$fields = $tmp->fgetcsv();
if ($fields !== false && $fields !== null) {
echo implode(' | ', $fields) . PHP_EOL;
}
}
CSV-HTTP-Download ohne temporäre Festplattendatei
<?php
// Daten aus einer Datenbank (hier simuliert)
$rows = [
['id' => 1, 'produkt' => 'Tisch', 'preis' => 149.99],
['id' => 2, 'produkt' => 'Stuhl', 'preis' => 49.99],
['id' => 3, 'produkt' => 'Regal', 'preis' => 89.90],
];
// Alles im RAM halten (negativer Wert => php://memory)
$tmp = new SplTempFileObject(-1);
$tmp->fputcsv(['ID', 'Produkt', 'Preis']);
foreach ($rows as $row) {
$tmp->fputcsv(array_values($row));
}
// HTTP-Header für Download senden
header('Content-Type: text/csv; charset=utf-8');
header('Content-Disposition: attachment; filename="produkte.csv"');
$tmp->rewind();
while (!$tmp->eof()) {
echo $tmp->fgets();
}
Speicher-Schwellenwert und Auslagerung testen
<?php
// Schwellenwert: 10 Byte — alles darüber geht in eine echte Temp-Datei
$tmp = new SplTempFileObject(10);
$tmp->fwrite('Kurztext'); // <=10 Byte: bleibt im RAM
$tmp->fwrite(str_repeat('X', 100)); // >10 Byte: wird ausgelagert
$tmp->rewind();
echo $tmp->fread(108); // liest alles zurück
// Wichtig · Fallstricke
Lebensdauer: Der temporäre Puffer existiert nur solange das SplTempFileObject-Objekt im Speicher lebt. Sobald das Objekt zerstört wird (z. B. durch unset() oder Ende des Scopes), gehen alle Daten verloren – es gibt keine persistente Datei, die manuell gelöscht werden müsste.
Kein Dateiname: Im Gegensatz zu SplFileObject existiert kein realer Dateipfad; getPathname() gibt einen internen Stream-Namen zurück, der nicht als Pfad für andere Operationen verwendet werden kann.
Zeilenweise Iteration: Beim Iterieren über das Objekt (foreach) liefert jede Iteration eine rohe Zeile als String. Soll CSV-Parsing aktiv sein, muss SplFileObject::READ_CSV via setFlags() gesetzt oder explizit fgetcsv() aufgerufen werden – andernfalls enthält current() einen einfachen String.