Cache
Wir nutzen Docker für unsere TYPO3-Projekte. Um Codeänderungen auf dem Live-System zu veröffentlichen, müssen wir nur den master-Branch der TYPO3-Projekterweiterung ändern und Jenkins macht den Rest: Ein neues Webserver-Image mit dem ganzen PHP-Code bauen, dieses auf den Produktionsserver ziehen, den neuen Container starten, den Zwischenspeicher (Cache) leeren und den alten Container stoppen.
Weil sich am Code zwischen den Deployments potentiell alles geändert haben könnte, müssen wir alle Caches im TYPO3 leeren. Abgesehen von den Datenbankcachetabellen werden auch alle Dateien in typo3temp/ geleert.
Responsive Layout & focuspoint
Unsere TYPO3-Projekte haben ein „responsive Design“ – es kann in jeder Auflösung angeschaut werden, und es sieht immer gut aus. Unterschiedliche Auflösungen und Bildschirmformate benötigen oftmals unterschiedliche Bildgrößen und -formate – und diese Bilder müssen automatisch generiert werden.
Um sicherzustellen, daß der wichtige Teil eines Bilds unabhängig vom gewünschten Seitenverhältnis erhalten bleibt, nutzen wir die Focuspoint-Erweiterung für TYPO3. Redakteure markieren den wichtigen Teil eines Bildes im TYPO3-Backend, und dieser bleibt beim Zuschneiden auf jeden Fall erhalten.
Wenn man das Zuschneiden mit verschiedenen Auflösungen für normale und hochauflösende Bildschirme kombiniert, haben wir bis zu 6 Bilder die für jedes einzelne Bild auf der Website generiert werden müssen (2 unterschiedliche Seitenverhältnisse + 2 Auflösungen für jedes davon).
Beim Leeren von typo3temp/ werden alle diese zugeschnittenen und skalierten Bilder weggeworfen und müssen neu generiert werden. Der Aufruf einer Seite mit vielen Bildern dauerte bis zu 2 Minuten – erst dann waren alle Bildvarianten neu berechnet. Das dauerte viel zu lange.
Ordner für generierte Bilder
Unser Ziel war es also, die generierten Bilder zu behalten. Die Dateinamen sind ein Hash der Bildverarbeitungskonfigurationsoptionen und damit über die Zeit stabil. Das Leeren des Zwischenspeichers hat keine Auswirkungen auf den Dateinamen.
Informationen über diese automatisch erstellten Dateien werden auch in der Datenbank gespeichert, und zwar in der Tabelle sys_file_processedfile. Da die Datenbank über Deployments hinaus bestehen bleibt, ist der Inhalt dieser Tabelle auch immer verfügbar.
Wenn man einen Abzug der Live-Datenbank auf dem Test- oder Entwicklungssystem verwendet, merkt TYPO3 wenn Dateien fehlen und generiert sie automatisch neu.
Lösung
focuspoint speicherte zugeschnittene Dateien bisher in typo3temp/focuscrop, was ja beim Deployment gelöscht wurde. Wir haben einen Patch gebaut, um das konfigurierbar zu machen.
Damit haben wir einen neuen Ordner im Hauptverzeichnis angelegt: processed. Dieser wurde ins TYPO3 über einen Dateispeicher-Datensatz („file storage“) eingebunden (mit uid 2), der seinen Basispfad auf processed gesetzt bekommt (Pfadtyp: relativ).
Die focuspoint-Erweiterung wurde so eingestellt, daß sie ihre Dateien in processed/focuspoint ablegt.
Der Dateispeicher „fileadmin (auto-generated)“ wurde angepasst, damit er die bearbeiteten und temporären Bilder in 2:_processed_ speichert.
Nach diesen Änderungen landen alle automatisch generierten Bilder im Verzeichnis processed. Wir haben den Docker-Container so konfiguriert, daß processed vom Hostsystem eingebunden wird und damit die Daten behält, wenn neue CMS-Container ausgespielt werden.
typo3cms:
image: docker.example.com/project-typo3cms:latest
volumes_from:
- storage
volumes:
- ./semitemp/processed:/var/www/site/htdocs/processed
Das Generieren einer Seite mit über 200 Bildern dauert direkt nach dem Deployment mit leeren Caches wenige Sekunden anstatt von Minuten. Mission erfüllt.
Dieser Artikel ist die Übersetzung des Blogeintrags Improving TYPO3 docker cache warming speed unseres Mitarbeiters Christian.