Необходимо мне вдруг стало отлаживать мой хобби-проект http://spaceismine.org/ на Windows-машине, который в production-версии работает на Fedora. А на linux-системах нет проблем с установкой расширений, подобных imagick. Для Fedora, к примеру, достаточно установить расширение через yum и перезапустить apache:

yum install php-pecl-imagick
service httpd restart

В Windows же не все так просто. Менеджер пакетов PECL под окнами очень капризен и сразу работать не хочет. Для него нужны танцы с бубном, описанные в мануалах. Я решил пойти слегка другим путем: установить imagick, вручную прикрутив его к php.

В целом, ImageMagick – открытое бесплатное программное обеспечение, которое служит для обработки графической информации. А imagick – это php-wrapper (обвязка) для библиотек ImageMagick. Файлы, которые мне понадобились:

http://www.imagemagick.org/download/binaries/ImageMagick-6.6.2-0-Q16-windows-dll.exe

http://valokuva.org/builds/ext/vc9/ts/imagick/2010-05-24_1007/php_imagick_ts.dll

Был выбран wrapper thread-safe, так как версия php, которая была установлена в XAMPP была так же thread-safe. В итоге, я установил ImageMagick и скопировал скачанный php_imagick_ts.dll в место:

C:\xampp\php\ext\php_imagick_ts.dll

И тут мне попался огромный подводный камень. Проблемы возникли с тем, что php в XAMPP был скомпилирован с помощью Visual Studio 6.0, а модуль php_imagick_ts.dll – в Visual Studio 9.0 и из-за разных подписей они вместе напрочь отказались работать. А модуль imagick, скомпилированный в VC6 найти так и не удалось.

Я взглянул на версию php, она была 5.3.1, а на production’е у меня 5.3.2. Не очень страшно, но захотелось все же обновить и php. Итак моя, казалось бы безобидная идея, превращается в эпопею. :)

Что ж, я люблю все новое и решил выкачать thread-safe php, собранный в VC9, чтобы он был совместим с imagick. Долго искать не пришлось.

http://windows.php.net/downloads/releases/php-5.3.2-Win32-VC9-x86.zip

Итак, переименовав на случай отката C:\xampp\php в C:\xampp\php5vc6, я распаковал содержимое свежего php в чистую папку C:\xampp\php. Затем скопировал модуль imagick в C:\xampp\php\ext\php_imagick_ts.dll

Понадобилось скопировать C:\xampp\php\php.ini-development в C:\xampp\php\php.ini, так как последнего не было на месте. Также пришлось немного подкорректировать этот дефолтный php.ini, патч (unified diff) примерно такой:

--- C:\xampp\php\php.ini Mon May 24 16:09:59 2010 UTC
+++ C:\xampp\php\php.ini-development Wed Mar 3 13:40:56 2010 UTC
@@ -784,7 +784,7 @@
 ;include_path = ".:/php/includes"
 ;
 ; Windows: "\path1;\path2"
-include_path = ".;C:\xampp\php\PEAR"
+;include_path = ".;c:\php\includes"
 ;
 ; PHP's default setting for include_path is ".;/path/to/php/pear"
 ; http://php.net/include-path
@@ -806,7 +806,7 @@
 ; http://php.net/extension-dir
 ; extension_dir = "./"
 ; On windows:
-extension_dir = "ext"
+; extension_dir = "ext"

 ; Whether or not to enable the dl() function.  The dl() function does NOT work
 ; properly in multithreaded servers, such as IIS or Zeus, and is automatically
@@ -876,7 +876,7 @@

 ; Maximum allowed size for uploaded files.
 ; http://php.net/upload-max-filesize
-upload_max_filesize = 10M
+upload_max_filesize = 2M

 ; Maximum number of files that can be uploaded via a single request
 max_file_uploads = 20
@@ -948,7 +948,7 @@
 ;extension=php_curl.dll
 ;extension=php_dba.dll
 ;extension=php_exif.dll
-extension=php_fileinfo.dll
+;extension=php_fileinfo.dll
 ;extension=php_gd2.dll
 ;extension=php_gettext.dll
 ;extension=php_gmp.dll
@@ -956,17 +956,17 @@
 ;extension=php_imap.dll
 ;extension=php_interbase.dll
 ;extension=php_ldap.dll
-extension=php_mbstring.dll
+;extension=php_mbstring.dll
 ;extension=php_ming.dll
 ;extension=php_mssql.dll
-extension=php_mysql.dll
+;extension=php_mysql.dll
 ;extension=php_mysqli.dll
 ;extension=php_oci8.dll      ; Use with Oracle 10gR2 Instant Client
 ;extension=php_oci8_11g.dll  ; Use with Oracle 11g Instant Client
 ;extension=php_openssl.dll
 ;extension=php_pdo_firebird.dll
 ;extension=php_pdo_mssql.dll
-extension=php_pdo_mysql.dll
+;extension=php_pdo_mysql.dll
 ;extension=php_pdo_oci.dll
 ;extension=php_pdo_odbc.dll
 ;extension=php_pdo_pgsql.dll
@@ -985,7 +985,6 @@
 ;extension=php_xmlrpc.dll
 ;extension=php_xsl.dll
 ;extension=php_zip.dll
-extension=php_imagick_ts.dll

 ;;;;;;;;;;;;;;;;;;;
 ; Module Settings ;

Таким образом мне удалось подружить XAMPP и imagick, и обновить PHP в XAMPP до версии 5.3.2. Надеюсь, я смог спасти хотя бы кого-нибудь от граблей. :)