Mogc beim Leipziger Firmen-Fussball-Cup
Team Mogic beim Leipziger Fussball-Firmen-Cup
5. April 2017
Kayak at work
Safe for work: Diese neue Reise-Suchmaschine ist ein Spreadsheet
10. April 2017

Docker: Schnelleres Cache-Warming für TYPO3

TYPO3 Cache Warming

TYPO3 Cache Warming

Nach einem Deployment auf Produktionssysteme mit TYPO3 mussten wir oft lange warten bis alle Bilder im richtigen Zuschnitt für Desktop, Tablet und Smartphone online wieder verfügbar waren. Grund: Das Füllen des Caches dauerte für Seiten mit vielen Bildern bis zu 2 Minuten. Im Beitrag erklären wir, wie wir diese Zeit auf wenige Sekunden verringern konnten, indem wir skalierte und zugeschnittene Bilder nicht löschen. 

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.

focuspoint

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).

typo3-file-storages typo3-processed-filestorage

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.

typo3-fileadmin-filestorage

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.

Teil der docker-compose.yml:

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.

Foto: Pixabay, jarmoluk


Dieser Artikel ist die Übersetzung des Blogeintrags Improving TYPO3 docker cache warming speed unseres Mitarbeiters Christian Weiske.