PHP, Imagick und Windows

Für heute hatte ich mir ein weiteres komplexeres Thema unserer Datenbank auf Arbeit vorgenommen:
An vielen Stellen benötigen wir externe Dateien – sei es um Handbücher schnell und einfach greifbar zu haben, Bilder von einem Schaden oder auch nur zur allgemein zu einem Bauteil ablegen zu können.
Eine Option wäre die Ablage als Datei im Dateisystem des Webservers – das funktioniert, aber es ist schwierig Meta-Informationen wie den Titel abzulegen. Für Bilder ist es oftmals hilfreich eine Ansicht zu haben, die nicht gleich das vollständige Bild sondern nur eine Vorschau zeigt – sei es als originäres Thumbnail oder auch nur in einer Größe die nicht gleich den Bildschirm sprengt, sondern sich in die Seite nach Bedarf einpasst.
Und was auch ganz praktisch wäre – wenn schon etwas gelöscht wird, sollten vielleicht auch die Leichen in Form von nicht mehr benötigten Dateien verschwinden.

Für die THW-Website, welche ich eine zeitlang betreut habe, hatte ich sowas schon einmal realisiert, allerdings war das technisch nicht so ganz ausgereift und ich wollte es wenn dann gleich auch noch technisch sauber bekommen – wenn man schonmal dabei ist. Eine Anpassung war ohnehin notwendig, denn es geht jetzt nicht mehr nur um Bilder sondern um Dateien und Dokumente in jeglicher Form: Also auch PDFs, Excel-Tabellen, und diverse andere Dinge die da so anfallen können.

Aber das Basis-Wissen war ja glücklicherweise schon da. Nach ein wenig Bastelei und Anpassungen an der Datenbank-Struktur war der Code dann auch soweit lauffähig. Mit dem kleinen Problem, dass ich bisher auf meinem Entwicklungsrechner kein Imagick installiert hatte.
Was zum …. ist Imagick? – Imagick ist eine recht umfangreiche und mächtige Bibliothek zur Bildbearbeitung, die auch recht zügig arbeitet. Unter anderem kann sie Bild-Dateien in der Auflösung reduzieren und bietet praktische Möglichkeiten um Bilder zu bearbeiten (Stichwort: Wasserzeichen, Copyright-Vermerke etc.).

Von meiner Linux-Umgebung bin ich ja schon etwas verwöhnt – “apt-get install xyz” hilft in den meisten Fällen und wenn nicht hat man die notwendigen Erweiterungen dank PECL und PEAR auch recht schnell nachinstalliert. Unter Windows gestaltet sich das nicht ganz so einfach – vor allem die Fehlersuche ist mühsam und besteht aus jeder Menge Trial-Error.

Auf Anhieb tut mal gar nichts – auch nicht nach der Installation der aktuellen Imagick-Version. Ständig bekomme ich beim Serverstart die Meldung “Modul kann nicht gefunden werden” – sehr aussagekräftig. Wenn man dann mal ein wenig sucht, findet man, im Englischen heißt die Fehlermeldung “could not find procedure” – das gibt immerhin schonmal einen besseren Anhaltspunkt wo der Fehler sein könnte – es mangelt wohl nicht an der DLL-Datei sondern an der von dort referenzierten Library in Imagick.

Was dann noch erwschwerend hinzu kommt: Es gibt mehrere Versionen und Compilate der DLL für Windows:
thread-safe, non-thread-safe und einmal mit Visual C 6 und Visual C9 kompiliert (entsprechend den Versionen von Visualstudio) kompatibel sind die natürlich nicht :-O

Es hat mich ziemlich viel Nerven gekostet, aber hier habe ich jetzt eine Lösung die mit folgender Kombination funktioniert:
– WAMP-Server 2.1
– Apache 2.2.17
– PHP 5.3.5
– ImageMagick 6.6.9-7

Hier die Anleitung:

1.) ImageMagick installieren und zwar genau diese Version hier:
http://www.imagemagick.org/download/binaries/ImageMagick-6.6.9-7-Q16-windows-dll.exe
Das ist die dynamisch gelinkte Version mit 16 Bit Qualität pro Subpixel und inklusive der notwendigen DLLs
2.) Eine Umgebungsvariable anlegen die auf das Installationsverzeichnis verweist: MAGICK_HOME=c:\Programme\Imagick-xyz\
3.) Neustart machen (warum Windows das braucht – keine Ahnung aber erst dann rafft es die Kiste, dass es da überhaupt Libraries für gibt – und die Fehlermeldungen werden klarer)
4.) WAMP 2.1 ist mit VC6 kompiliert, also brauchen wir eine entsprechende Version der Extension DLL für PHP – sonst gibt es Fehlermeldungen der Art:
PHP-Build-Version = “Zahlenkombination”
Module-Build Version = “Zahlenkombination”
Those values need to match
Die passende Version für unseren Fall findet sich hier:
[url]http://www.sk89q.com/downloads/imagick/2.3.0/API20090626-TS-VC6/php_imagick.dll[/url]
5.) Datei herunterladen und im WAMP-Verzeichnis\PHP\5.3.5\ext\ ablegen
6.) PHP.ini anpassen und die Extension in die Liste eintragen
7.) Server neu starten – es sollte diesmal keine Fehlermeldung geben
8.) Geschafft und man kann sich den eigentlichen Problemen zuwenden!

Ergo: Es ist verdammt aufwändig Erweiterungen für PHP unter Windows einzubauen – die verschiedenen Versionen machen es einem ebensowenig leicht wie die teils wenig hilfreichen Fehlermeldungen und die Tatsache das so Dinge wie der Neustart in keiner Dokumentation auftauchen.

Dank an all die verschiedenen Seiten und Leute die sich ebenfalls schon mit dem Problem beschäftigt haben und Tipps zur Lösung geben haben:

[list]
[*][url]http://www.blogix.net/2011/04/03/imagemagick-xampp-windows-installieren/[/url]
[*][url]http://www.sk89q.com/2010/03/vc6-windows-binaries-for-imagick-2-3-0/[/url]
[*][url]http://www.knowledge-transfers.com/it/installing-imagemagick-on-windows-setup-imagick-on-php/[/url]
[*][url]http://valokuva.org/?page_id=50&cpage=7#comments[/url]
[/list]

Schade, dass es so aufwändig ist eine derart praktsiche Bibliothek unter Windows einzusetzen – wie gesagt unter Linux ist sie hervorragend gepflegt.