Imagick unter Windows

Für unsere Applikation, die wir seit über einem halben Jahr entwickeln, setzen wir zur Erzeugung von Thumbnails und Seiten-Previews von PDF-Dateien bevorzugt ImageMagick ein. Wer mehr zu ImageMagick wissen will, der Besuche die Homepage oder lese sich den Wikipedia-Artikel durch. Der Vollständigkeit halber sei an dieser Stelle erwähnt, dass wir ImageMagick in Kombination mit Ghostscript einsetzen, damit auch PDF (und natürlich auch PostScript-Dateien) gerendert werden kann.

Aus PHP heraus rufen wir ImageMagick sowohl unter Windows als auch unter Linux per exec() auf. Nicht gerade besonders elegant, aber wirkungsvoll 😉 Vor allem ist das Ansprechen per exec() in einer Objekt-orientierten Umgebung alles andere als intuitiv. (Wir setzen bei besagtem Projekt Symfony als Framework ein). So haben wir uns also eine Adapter-Klasse geschrieben, die den Zugriff auf ImageMagick hübsch objektorientiert verpackt.

Unter Linux bereitet diese Art der Einbindung von ImageMagick uns keinerlei Kopfschmerzen. ImageMagick ist ebenso wie GhostScript auf den meisten Linux-Servern schon installiert oder mit geringem Aufwand über die Distributions-eigene Paketverwaltung schnell nachinstalliert. Auch die Performance lässt sich sehen. Und unter Windows? Die Installation von IM und GS klappt mit den grafischen Installern noch ohne Probleme. Aber die Performance von ImageMagick lässt per PHP und exec() doch ein wenig zu wünschen übrig (für das Rendern einer Vorschau benötigt unsere Applikation die doppelte bis dreifache Zeit unter Windows – trotz schnellerem Prozessor und mehr Hauptspeicher). Man merkt halt schon, für welche Plattform sowohl IM als auch GS entwickelt wurden.

Als native Schnittstelle gibt es schon seit Jahren das PECL-Paket Imagick. Es wurde jedoch seit 2004 nicht mehr weiter entwickelt. Erst im Frühjahr dieses Jahres haben sich wieder zwei Entwickler der Weiter-Entwicklung angenommen. Mittlerweile ist Imagick auch als Version 2.0.x stabil. Die 2er-Version wurde konsequent auf PHP5 und Oojekt-Orientierte Programmierung ausgelegt, so dass es keine Probleme bereiten sollte, Imagick in vorhandenen Projekten einzusetzen. Einziges Problem unter Windows ist jedoch, das PECL-Pakete nicht in PHP, sondern in C implementiert sind und man deshalb entweder vorkompilierte DLLs benötigt, oder selber den Compiler anwerfen muss. Da ich nicht über Microsoft Visual Studio verfüge und auch sonst ein wenig mit C auf Kriegsfuß stehe, blieb nur noch Variante eins übrig.

Der Finne Mikko Koppanen, seines Zeichens einer der beiden Entwickler von Imagick, hat aber über sein durchaus lesenwertes Blog die vorkompilierten DLLs für Windows bereitsgestellt. Die passende DLL herunter zu laden und in mein PHP-Extensions-Verzeichnis zu speichern war noch nicht wirklich schwierig. Aber den Kram ans Laufen zu bekommen schon. Das alte HowTo, auf welches auch Mikko hingewiesen hat, war nur ansatzweise hilfreich. Vor allem hat es irgendwie das Layout zerschossen und ich kann daher nur jedem nahe legen, der sich dieses HowTo durchlesen möchte und Firefox mit installierter Web-Developer-Toolbar zur Verfügung hat, die Funktion zum Deaktivieren von Inline-Styles zu nutzen. Andernfalls lassen sich manche Quotes nicht lesen…

Nach Studium des o.g. HowTos habe ich mich dann an die Arbeit gemacht, Imagick auf meinem Notebook (Windows XP Pro, Apache 2.2.4 als Service, PHP 5.2.3 als CGI) ans fliegen zu bekommen:

  • Die heruntergeladene DLL php_imagick_dyn-Q8.dll landet im Extensions-Verzeichnis meiner PHP-Installation (bei mir C:\php5\ext)
  • Die DLL muss natürlich in der php.ini aktiviert werden:
    extension=php_imagick_dyn-Q8.dll dem Block mit den Erweiterungen hinzufügen
  • Eine info.php mit folgendem Inhalt ins htdocs-Verzeichnis gelegt:
    <?php
    phpinfo();
    ?>

    und im Browser aufgerufen.
  • Und was ist passiert? Nichts! Kein Imagick wird mir unter den aktivierten PHP-Erweiterungen angezeigt. Wenn ich PHP auf der Kommando-Zeile anspreche, dann bekomme ich die Fehlermeldung angezeigt, dass es nicht möglich wäre die besagte DLL zu laden.
  • Dem obigen Howto konnte ich entnehmen, dass der Pfad zu ImageMagick-Installation der PATH-Umgebungsvariable von Windows hinzuzufügen sei. Gesagt, getan, aber der Kram will immer noch nicht.
  • Der Vorschlag mit dem Setzen von
    SetEnv MAGICK_HOME="C:/Programme/ImageMagick"
    in der httpd.conf des Apache will auch nicht so richtig funktionieren.
  • Letztendlich hat es dann damit geklappt, indem ich die Umgebungsvariable MAGICK_HOME mit dem Wert C:\Programme\ImageMagick Windows beigebracht habe.
  • Aber erst nach einem Windows-typischen Neustart konnte ich endlich das Ergebnis meiner Bemühungen nach Aufruf der info.php im Browser bewundern:

    Ausschnitt aus der info.php

Nachdem jetzt alles läuft, wollte ich doch mal ausprobieren, ob der Performance-Zuwachs tatsächlich so toll ist, wie es Mikko als Ergebnis seines „Micro-Benchmark“ in seinem Blog gepostet hat. Das Ergebnis war doch etwas ernüchternd: Teilweise hat es mit Imagick doppelt so lange gedauert, als über den Aufruf von convert via exec().

Ich werde mal ein wenig an ein paar Stellschrauben drehen (z.B. wie sich das Einstellen der „Ressource Limitations“ auswirkt) und was ich noch mit den ganzen anderen Parametern anstellen kann, die im Manual zu Imagick genannt, aber kaum bzw. nicht weiter beschrieben sind.

Auch werde ich demnächst ein wenig Code und Beispiel-Dateien posten, mit denen meine Versuche nachvollzogen werden können.

Dieser Beitrag wurde unter PHP, Software-Wahnsinn veröffentlicht. Setze ein Lesezeichen auf den Permalink.

3 Kommentare zu Imagick unter Windows

  1. Ich hatte ähnliche Probleme mit der Installation von Imagick. Früher waren die Dateien richtiger Teil der XAMPP Installation. Allerdings weist Mikko in seinem Blog auch auf eine statische Version hin, die komplett ohne ImageMagick läuft. Ich habe die Version heruntergeladen, umbenannt, wie es in der php.ini steht und schwups auf Anhieb ohne Neustart, etc… konnte ich Imagick benutzen. Meine Erfahrungen sind auch, dass es nicht wesentlich, aber geringfügig schneller ist unter Windows, und auch bei beschädigten Bildern teilweise es doch noch schafft die Thumbnails zu generieren. Also ich bin großer Fan von Imagick.

  2. Christian sagt:

    Hallo,

    ich benötige für mein aktuelles Projekt eine SVG.
    Diese funktioniert schon wunderabr wie man unter:
    http://ragesoft.de/index.php?option=com_content&task=view&id=77&Itemid=50
    sehen kann. Jedoch nur als SVG. Da der IE jedoch probleme macht, bin ich auf der Suche nach einem schönen Converter.
    Ich hab jetzt auf meinem Testserver ImageMagick installiert, der Test von Console aus lief. Der von PHP aus nicht. Hab dann alle dll’s wie hier beschrieben eingebunden, die Umgebungsvariablen gesetzt und server neugestartet. Imagick taucht aber immer noch nicht in der PHPInfo auf :<
    Hier die Umgebungsvariable:
    MAGICK_HOME C:\Programme\ImageMagick-6.5.4-Q16
    habe auch die dll "php_imagick.dll" in das ext verzeichnis kopiert und alles -.-

    Bitte um Rat. Vielen dank! (gern auch per Mail)

  3. Ingo sagt:

    @Christian: Wie ich gesehen habe, läuft Dein Produktiv-Server unter Debian. Warum also kein Test-Server, der auch mit Debian läuft – es kann ja auch eine virtuelle Maschine sein. Egal.
    Schau mal auf Mikkos Seite nach, ob Du dort (evtl. auch in den Kommentaren) eine Lösung findest,

Kommentare sind geschlossen.