knuspermagier.de
Ein L und zwei P. Philipp!

Erlebnisse im Kirby-Land, Folge 1 - Massenweise Thumbnails

Willkommen zu einer neuen Blogpost-Reihe, die garantiert niemals fortgeführt werden wird. Diesmal nehme ich euch mit ins wunderschöne Kirby Traumland.

Ja, ich hab schon ein paar mal was mit Kirby gemacht und in meiner großen CMS-Umfrage (einen Follow-Up-Post dazu gibt es bald!) letztens empfahlen es ja auch viele. Kirby ist auch echt nett. Daher entschied ich mich, die neue Version von hej.world damit umzusetzen (mehr dazu bald in diesem Blog!).

Jedenfalls gibt es bei hej.world von einer Sache sehr viel: Fotos! Jede Seite in einer Galerie hat so 40-60 und für jedes brauche ich so 5 Thumbnails. (Low-Quality Platzhalter, Passend, Passend@2x, Lightbox, Lightbox@2x)

Natürlich kann Kirby wunderbar Thumbnails erzeugen, nur leider dauert das vierhundert Jahre, wenn 300 Thumbnails erzeugt werden müssen, weil gdlib (und Imagemagick) nicht mega schnell ist und der PHP-Prozess natürlich eher nur einen Core auslastet.

Natürlich bin ich nicht der erste mit dem Problem, daher erschuf jemand kirby-imagekit, ein Plugin das mal alle Contentseiten aufruft, schaut, welche Thumbnails erzeugt werden müssen und diese dann versucht möglichst asynchron per Ajax-Requests zu erstellen.

Zuerst war ich darüber auch sehr erfreut, am Ende war mir das aber auch noch viel zu langsam, schon allein das Analysieren dauerte mehrere Minuten und das Erzeugen der Thumbnails nahm dann gefühlt gar kein Ende.

(Das kann daran gelegen haben, dass ich Kirby aktuell noch lokal per PHP Development Server ausführe, und daher alles keine Möglichkeit hat, irgendwie mehrere Cores zu benutzen. Meine VM ist dafür auch nicht richtig konfiguriert und meine Digital Ocean VM hat auch nur einen Core…)

Naja. Da ich bei albumup viel Spaß mit meinem Thumbnail-Service habe, der libvips benutzt, dachte ich mir, ich klöppel mir hier etwas ähnliches zusammen.

Also baute ich mir ein Script, das die Seite rendert und mit einer ganz besonders präparierten Thumbs-Komponente aufzeichnet, welche Thumbnails so gebraucht werden. Diese werden in eine json-File geschoben. Auf der anderen Seite hab ich dann ein NodeJS-Script, welches ich passenderweise “jpgjpgjpg.js” nannte (Kirby, König Dedede, ihr versteht?). In unter 30 Zeilen jagt das alle Thumbnails durch libvips.

(Die Skripte habe ich hier mal auf Github geworfen)

Damit ist es mit möglich alle 300 Thumbnails in gut 30 Sekunden zu erstellen (ja, ok, mein Macbook ist auch nicht das langsamste). Juchu!

Jetzt hab ich nur noch ein Problem, vielleicht kann mir jemand dabei helfen.

Gerade hab ich es so gebaut, dass ich das Skript per php images.php "pfad-zur-seite" aufrufe. Eigentlich hätte ich gern, dass er direkt alle Seiten rendert, nur leider funktioniert das nicht. Wenn ich irgendwie versuche durch alle Pages zu loopen, und sie alle zu rendern (per $kirby->render($page)) , landet immer am Ende nur die erste Seite im JSON. Als wäre die render-Funktion nicht dafür ausgelegt in einem “Request” mehr als einmal aufgerufen zu werden. Eine kurze Code-Recherche brachte mich leider nicht ans Ziel, daher begnügte ich mich erstmal damit, jede Seite einzeln zu “thumbnailen” — muss ich ja auch nur einmal machen. Wenn jemand ne Idee hat, sagt bitte gerne bescheid!

Kommentare, Feedback und andere Anmerkungen?
Schreib mir eine E-Mail 🤓