Zusammenfassung
Der TYPO3 DataHandler speichert alle Daten im TYPO3 Backend. Er ist ein sehr wichtiges Bauteil. Er achtet stark auf die Sicherheit und die Richtigkeit der Daten. Das macht ihn bei großen Datenmengen aber sehr langsam.
Wir testen in diesem Text das Speichern von 10.000 Einträgen. Wir messen die Leistung ganz genau. Wir zeigen Ihnen Wege für eine messbare Verbesserung.
Das Ergebnis ist sehr deutlich. Wir teilen die Daten in Gruppen auf (Batch Processing). Wir schalten unwichtige Funktionen im Code ab. Dadurch steigt die Leistung um über 90 Prozent. Die Zeit sinkt von 412 Sekunden auf unter 39 Sekunden.
Inhaltsverzeichnis
Der TYPO3 DataHandler: Die Architektur
Der DataHandler ist nicht für schnelle Aufgaben in großen Mengen gebaut. Er ist ein strenger Wächter für alle Änderungen im TYPO3 Backend. Dieser Bauplan macht das System sehr langsam.
Der strenge Wächter
Der DataHandler ist der einzige Zugang für alle Änderungen an Daten. Diese strenge Kontrolle sichert das System. Aber sie kostet bei jedem einzelnen Eintrag viel Zeit.
Der DataHandler macht diese Aufgaben:
- Rechteprüfung: Er prüft die Rechte von jedem Benutzer bei jedem Eintrag.
- TCA Regeln: Er prüft alle strengen Regeln für die Daten.
- Verlauf und Versionierung: Er speichert alte Versionen von den Daten.
- Logging: Er schreibt jede Änderung in ein langes Protokoll.
- Ereignisse senden: Er informiert andere Programmteile über die Änderung.
- Cache leeren: Er leert den Zwischenspeicher (Cache) nach jeder Änderung.
Das Problem mit dem Zustand
Die Entwickler von TYPO3 sagen es ganz deutlich: Der DataHandler ist stateful. Das bedeutet: Er merkt sich seinen Zustand. Sie müssen ihn für jede Aufgabe neu starten. Sie dürfen einen DataHandler nicht für mehrere Aufgaben wiederverwenden.
Der DataHandler sammelt bei der Arbeit viele Daten an. Er speichert Fehler und Verbindungen in internen Listen ab. Bei tausenden Einträgen wachsen diese Listen immer weiter. Das verbraucht sehr viel Arbeitsspeicher. Das Programm wird dadurch immer langsamer.
Dieses Problem gibt es auch beim TYPO3 QueryBuilder. Diese Bauteile sind nur für einzelne kleine Aufgaben gedacht. Sie eignen sich überhaupt nicht für große Schleifen.
Die Leistungsanalyse in Zahlen
Die Testumgebung
Gute Tests brauchen immer die gleichen Bedingungen. Wir nutzen bekannte und offene Programme für unsere Tests:
Der Aufbau:
- TYPO3 Version 12 LTS in einem DDEV Container.
- Symfony Commands für den Start in der Konsole.
- 10.000 Testeinträge. Wir erzeugen diese mit
fakerphp/faker. - Messung: Wir messen die Laufzeit und den Arbeitsspeicher genau.
Der Standard Test: 10.000 Einträge
Wir testen im Standard Test einen einfachen Import. Wir laden alle 10.000 Einträge in eine einzige Liste. Wir geben diese Liste an einen einzigen DataHandler.
| Messwert | Wert | Einheit |
|---|---|---|
| Laufzeit | 412.58 s | Sekunden |
| Höchster Arbeitsspeicher | 784.31 MB | Megabyte |
| Durchsatz | 24.24 rec/s | Einträge/Sekunde |
Das Ergebnis: Das Programm braucht fast 7 Minuten. Es verbraucht fast 800 Megabyte Arbeitsspeicher. Es verarbeitet nur 24 Einträge in der Sekunde. Das ist für große Projekte viel zu langsam.
Standard gegen verbesserte Leistung: Der Unterschied ist sehr groß. Der Wert steigt von 24 auf 258 Einträge in der Sekunde.
Die Suche nach den Bremsen
Wir suchen nach den langsamen Stellen im Programm. Es gibt keinen einzelnen großen Fehler. Viele kleine Dinge bremsen das Programm:
- Cache leeren: Befehle für das Leeren vom Zwischenspeicher.
- Reference Index: Die Datenbank prüft oft die Verbindungen zwischen Daten.
- Logging: Das Programm schreibt das Protokoll und alte Versionen auf.
- Ereignisse senden: Das Programm ruft andere Programmteile auf.
Wir müssen diese Probleme bei großen Datenmengen schlau umgehen.
Verteilung der Bremsen: Das Leeren vom Cache und der Reference Index sind die größten Bremsen.
Verbesserungen für die Leistung
Einstellungen am DataHandler verändern
Der DataHandler hat Schalter für bestimmte Funktionen. Sie können diese Schalter bei großen Importen sicher ausschalten:
// Logging abschalten
$dataHandler->enableLogging = false;
// Rechteprüfung überspringen (nur in der Konsole mit Administrator-Rechten)
$dataHandler->bypassAccessCheckForRecords = true;
// Prüfung nach dem Speichern abschalten
$dataHandler->checkStoredRecords = false;Sie schalten das automatische Leeren vom Cache hiermit ab. Sie müssen den Cache nach dem Import selbst komplett leeren. Nutzen Sie diesen Befehl: vendor/bin/typo3 cache:flush
Verbesserungen bei Datenbank und TCA
Versionierung abschalten:
// Versionierung für die Dauer vom Import abschalten
$GLOBALS['TCA']['tx_news_domain_model_news']['ctrl']['versioningWS'] = false;Datenbank Indizes: Sie brauchen für alle wichtigen Spalten in der Datenbank einen Index. Das betrifft vor allem Fremdschlüssel und oft gesuchte Felder. Ohne diese Indizes nützen alle anderen Verbesserungen nichts.
Die wichtigste Strategie: Batch Processing
Die beste Verbesserung ist das Batch Processing. Das bedeutet: Wir verarbeiten Daten in kleinen Gruppen. So gehen Sie vor:
// Einträge in Gruppen von 500 Stück verarbeiten
$chunks = array_chunk($records, 500);
foreach ($chunks as $chunk) {
// NEUEN DataHandler für jede Gruppe starten
$dataHandler = GeneralUtility::makeInstance(DataHandler::class);
$dataHandler->enableLogging = false;
$dataHandler->bypassAccessCheckForRecords = true;
$dataMap = [];
foreach ($chunk as $record) {
$dataMap['tx_news_domain_model_news']['NEW' . uniqid()] = $record;
}
$dataHandler->start($dataMap, []);Batch Processing speichert alles sofort. Bei einem Fehler sind die Daten nur zur Hälfte gespeichert. Nutzen Sie Transaktionen für sichere Projekte. Das geht über Doctrine DBAL mit: beginTransaction(), commit(), rollback(). Bei einem Fehler nimmt das System alle Änderungen zurück.
Ergebnisse im Vergleich
Diese Tabelle zeigt die Wirkung von allen Verbesserungen:
| Einstellung | Zeit (Sekunden) | Verbesserung der Zeit | Arbeitsspeicher (MB) | Verbesserung Speicher |
|---|---|---|---|---|
| Standard (Eine Instanz) | 412.58 | 0.0% | 784.31 | 0.0% |
| Logging abgeschaltet | 385.11 | 6.7% | 780.15 | 0.5% |
| + Rechteprüfung übersprungen | 351.45 | 14.8% | 775.9 | 1.1% |
| + Versionierung abgeschaltet | 298.62 | 27.6% | 768.55 | 2.0% |
| Batch Processing (500 pro Gruppe) | 59.34 | 85.6% | 121.45 | 84.5% |
| Alle Verbesserungen zusammen | 38.77 | 90.6% | 98.5 | 87.4% |
Fazit: Kleine Änderungen bringen kleine Verbesserungen. Batch Processing ist der absolute Gewinner. Es macht das Programm um 85 Prozent schneller. Alle Strategien zusammen bringen 90.6 Prozent Zeitersparnis und 87.4 Prozent weniger Speicherverbrauch.
Der Durchsatz steigt von 24 Einträgen auf 257 Einträge in der Sekunde. Das ist perfekt für große Datenmengen.
Bilder zur Laufzeit
Die kleinen Änderungen helfen ein wenig. Das Batch Processing ist der größte Erfolg. Es senkt die Laufzeit sehr stark.
Bilder zum Arbeitsspeicher
Der Verbrauch vom Arbeitsspeicher sinkt erst durch das Batch Processing. Er fällt von über 780 Megabyte auf unter 100 Megabyte.
Die Zukunft: Ein neuer Bauplan für den DataHandler
Das große Problem beim aktuellen Design
Das Hauptproblem ist der Aufbau vom Programm. Der DataHandler macht alle Aufgaben in einem einzigen großen Baustein. Er kümmert sich um das Speichern, die Rechte und das Logging gleichzeitig. Das ist sicher für kleine Aufgaben. Es ist sehr schlecht für große Datenmengen.
Die Entwickler von TYPO3 kennen dieses Problem. Sie arbeiten an einem neuen Bauplan. Sie wollen die Aufgaben in einzelne Dienste trennen.
Neue Regeln: Trennung von Aufgaben
Ein modernes System braucht verschiedene kleine Dienste:
PersistenceService: Speichert nur die reinen Daten in der Datenbank.PermissionService: Prüft nur die Rechte der Benutzer.ValidationService: Prüft nur die Regeln für die Daten.VersioningService: Kümmert sich nur um alte Versionen.LoggingService: Schreibt nur das Protokoll.CacheService: Kümmert sich nur um den Zwischenspeicher.
Diese Dienste sind stateless. Das bedeutet: Sie merken sich keinen inneren Zustand. Sie arbeiten immer exakt gleich. Entwickler können sie sicher in großen Schleifen nutzen.
Ein Beispiel für einen neuen Import
Mit diesen neuen Diensten können Entwickler sehr schnelle Programme schreiben:
// Nur die benötigten Dienste einbinden
constructor(
private persistenceService: PersistenceService,
private cacheService: CacheService
) {}
async bulkImport(records: Record[]) {
// Transaktion per Hand starten
await this.connection.beginTransaction()
try {
const chunks = chunkArray(records, 500)
for (const chunk of chunks) {
// Daten direkt speichern - das ist sehr schnellFür normale Aufgaben nutzen Entwickler alle Dienste zusammen. Das bringt maximale Sicherheit. Für große und schnelle Aufgaben nutzen Entwickler nur die wirklich nötigen Dienste.
Empfehlungen und wichtige Erkenntnisse
Die wichtigsten Erkenntnisse
- Sicherheit geht vor Leistung: Der DataHandler achtet auf die Richtigkeit der Daten. Er ist extra nicht für Geschwindigkeit gebaut.
- Die Standard Leistung: 10.000 Einträge brauchen 7 Minuten und viel Arbeitsspeicher. Das ist nicht ausreichend für große Aufgaben.
- Der innere Zustand ist das Problem: Der DataHandler merkt sich seinen Zustand. Das verbraucht sehr viel Arbeitsspeicher.
- 90 Prozent mehr Leistung: Wir nutzen Batch Processing und schalten unwichtige Funktionen ab. Der Durchsatz steigt auf 257 Einträge pro Sekunde.
- Die Zukunft: Die TYPO3 Entwickler arbeiten an einem neuen System aus einzelnen Diensten.
Unsere Handlungsempfehlungen für Sie
Batch Processing ist Pflicht
Wichtig: Nutzen Sie ab 100 Einträgen immer Batch Processing. Starten Sie für jede Gruppe (250 bis 500 Einträge) einen neuen DataHandler. Das bringt die meiste Leistung.
Funktionen abschalten
Hilfreich: Schalten Sie in der Konsole das Logging ab. Überspringen Sie die Rechteprüfung. Schalten Sie die Versionierung im TCA ab, wenn Sie diese nicht brauchen.
Sicherheit durch Transaktionen
Daten schützen: Nutzen Sie Datenbank-Transaktionen für Ihr Batch Processing. Bei Fehlern nimmt das System alle Änderungen sofort zurück. Nutzen Sie dafür beginTransaction(), commit() und rollback().
Cache richtig leeren
Effizienz: Leeren Sie den Cache nicht nach jedem einzelnen Eintrag. Leeren Sie den Cache genau ein Mal ganz am Ende der Arbeit.
TYPO3 Core Updates
Zukunft: Beobachten Sie die Arbeit der TYPO3 Entwickler. Nutzen Sie die neuen, einzelnen Dienste, sobald diese fertig sind.
Datenbank vorbereiten
Basis: Setzen Sie immer gute Indizes auf die Spalten in der Datenbank. Ohne Indizes bringt auch der beste Programmcode überhaupt nichts.
DataHandler Klasse: Wichtige Eigenschaften
Die TYPO3 DataHandler Klasse hat viele Eigenschaften. Sie steuern das Verhalten vom System. Hier sehen Sie die wichtigsten Schalter für mehr Leistung:
Wichtige Eigenschaften im Code
So richten Sie den DataHandler richtig ein
Versionierung im TCA abschalten
Der fertige Import Code
Wir zeigen Ihnen den kompletten Code im Anhang. Der Code behandelt auch alle Fehler und zeigt den Fortschritt an. Sie können den Code direkt in TYPO3 ab Version 12 nutzen.