Bildkomprimierung für WordPress mit Mozjpeg – Praktische Umsetzung und Erfahrungen

Vor vier Wochen habe ich Euch versprochen, über die gemachten Erfahrungen mit Mozjpeg und auch die Praktische Umsetzung zu berichten; et voilà.

ZDF – Zahlen / Daten / Fakten

Vor der Optimierung meiner Bilder mit Mozjpeg hatte ich Vierhundert Dreiunddreissig Megabyte (433 MB), verteilt auf Zehntausend Dreiundneunzig (10093) Bilder auf den Festplatten meines RootServers liegen.
Nach der Optimierung, mit einer Bildqualität von Achtzig Prozent, waren davon noch Dreihundert Siebzig Megabyte (370 MB) an Datenvolumen vorhanden. Das sind Dreiundsechzig Megabyte (63 MB) weniger, nach Adam Riese also Vierzehn komma Fünf Prozent (14,5%).

Vor der Optimierung der Bilder hatte ich natürlich ein Backup aller vorhandenen Bilder im WordPress Uploads Ordner angefertigt, so dass die Optimierung aller Bilder in einem einzigen Schritt keine Gefahr darstellte.
Mein RootServer kam dabei nicht wirklich ins Schwitzen, das Script bezog lediglich Neun Prozent CPU und Null Komma Zwei Prozent Hauptspeicher, sprich eine Optimierung der Bilder „on the fly“ kann problemlos durchgeführt werden.

Praktische Umsetzung-mein kleines Shell-Script dazu

#!/bin/sh
if [ ! $1 ]; then
 echo "Keine Webseite angegeben"
 exit 3;
fi
if [ ! $2 ]; then
 echo "Kein Ordner angegeben"
 exit 3;
fi
#
# Variablendeklaration
#
SOURCE_PATHS="/var/www/htdocs/$1/wp-content/uploads/$2"
CJPEG="/opt/mozjpeg/bin/cjpeg"
WWW_USER="www-data"
WWW_GROUP="www-data"
LASTRUN="${BIN_PATH}/last-jpgopti"
FIND=`which find`
CHOWN=`which chown`
TOUCH=`which touch`

#### Do not edit below ####
find ${SOURCE_PATHS}  -type f -name *.jpg -newer ${LASTRUN}| while read line;do
        F_IN=$line;
        F_OUT="$line"_opt
        ${CJPEG} -quality 80 -optimize $F_IN > $F_OUT;
        mv $F_OUT $F_IN;
        chown ${WWW_USER}:${WWW_GROUP} $F_IN
done
if [ $? = 0 ]; then
 ${TOUCH} ${LASTRUN}
fi

Da das Cjpeg Binary die zu optimierenden Bilder leider nur in eine Bilddatei mit neuem Namen schreiben kann, bin ich über den unschönen Weg über eine Readline und moven der optimierten- auf die originäre Datei gegangen.
Da ein „mv“ jedoch eine atomare Operation ist, kein Problem. Mit der zwingenden Angabe eines Pfades ($1)  und eines Ordners ($2) bleibt die Option offen, einzelne Bilder oder Unterordner zur Optimierung mit Cjpeg anzugeben.

Um meine Bilder nicht doppelt zu optimieren, habe ich den Cronjob für das bisher eingesetzte Jpegoptim Script deaktiviert.

Wie immer freue ich mich über eure Kommentare und Verbesserungsvorschläge.

Update 07.05.2015: 

  • Änderung der SOURCE_PATH Variable
  • Einführung der LASTRUN und TOUCH Variable
  • Erweitern der „find Direktive“ um LASTRUN
  • Touchen der LASTRUN Datei