Сборка и установка расширений для PHP (extentions) в Windows среде
Если Вы столкнулись с необходимостью подключения в Windows PHP дополнительных расширений, которые отсутствуют в базовой установке PHP, то данная статья, возможно, поможет Вам добиться необходимого результата и сэкономит Вам парочку бессонных ночей, проведённых в поисках мало-мальски удобного решения этой, как оказалось, нетривиальной для рядового php программиста задачей…
Вступление
Пара слов, как появилась задача и связанные с ней проблемы.
Однажны в знакомой небольшой веб-студии пришёл заказ на создание веб-проложения, которое будет позволять пользователям производить куплю/продажу ценных бумаг на российских биржах ценных бумаг. Компания, сделавшая заказ, имеет большой опыт в предоставлении данных услуг в оффлайн, имеет ряд приложений для этого, которые используются на компьютерных терминалах, которые стоят на территории компании и большую клиентскую базу. Но дело в том, что со времён основания IT инфраструктуры компании, когда для работы была выбрана база данных IBM Informix, мало что изменилось. В результате, перед нами встала задача наладить взаимодействие нашего приложения, которое должно было быть написано на php, и БД клиента. Вот тут-то и появилась неожиданная проблема…
Завязка
Дело в том, что в силу определённых причин, все наши php-программисты работают в Windows окружении, используют последнюю стабильную версию php интерпретатора и веб-сервера apache на своих машинах. В связи с этим, встал вопрос о поиске pdo-драйвера для работы с Informix. Естественно, собранного расширения в сети не нашлось (вернее, нашлось, но, видимо, для ранних версий — php падал при попытке его подключить), а краткое описание на странице расширения PDO_INFORMIX намекало на то, что его-таки следует собирать из исходных кодов.
Ну что ж, проблема ясна — необходимо решение. Первое, что было сделано — это установка PEAR и попытка через pecl установить требуемое расширение. Однако, при попытке это сделать, установка прерывалась ошибкой.
>pecl install --alldeps pdo_informix downloading PDO_INFORMIX-1.2.6.tgz ... Starting to download PDO_INFORMIX-1.2.6.tgz (65,676 bytes) .................done: 65,676 bytes downloading PDO-1.0.3.tgz ... Starting to download PDO-1.0.3.tgz (52,613 bytes) ...done: 52,613 bytes 12 source files, building ERROR: The DSP PDO.dsp does not exist. 9 source files, building ERROR: The DSP PDO_INFORMIX.dsp does not exist.
Гугление ошибки не дало особого результата и, по большому счёту, все рекомендации сводились к тому, что лучше собрать расширение собственоручно, а не мучить бедный старый pecl в надежде, что он что-нибудь сможет собрать на windows машине.
Было принято решение попытаться собрать расширение. Однако, как всегда, оказалось, что с С++ у нас никто не знаком и решить задачу никто не может. Была попытка найти человека для исполнения задачи на фрилансе, но и это не принесло плодов: все, кто откликнулся, комментировали решение проблемы как «установить pecl и через него установить». Пришлось освоить процесс самому. Сразу скажу, с разработкой расширений для PHP не сталкивался, тем паче — с программированием на C++. В Visual Studio собрать dll тоже не получилось (расширение так же как и скаченные из интернетов версии крашили php). Всвязи с этим, было потрачено чуть более полутора суток на поиски и опробывание всяких решений, которые привели к тому, что был собран интерпретатор с необходимым расширением (pdo_informix) в виде shared-библиотеки, а полученная библиотека была скопирована в ext папку установленного PHP и подключена через php.ini. Не хочу мучить читателя рассказами о том, на какие грабли я наступал, сколько времени потратил на безуспешные попытки разобраться что же не получается и описывать fail attempts, а так же не претендую на элегантность решения — я просто опишу небольшой how-to, который родился в процессе изучения сабжа и помог мне победить эту напасть…
Кульминация (а-ка How-To)
Итак, задача в целом выглядит так:
- скачать и установить php (если не установлен)
- скачать и установить Informix Client SDK (Informix CSDKF)
- скачать исходники php и pdo_informix и собрать из них php
- извлечь из собранного релиза расширение
php_pdo_informix.dll
и подключить его в установленную версию PHP - работать
Далее я приведу выдержку-перевод-адаптацию статьи из php wiki, посвящённую сборке PHP на Windows, исполненную под наш конкретный случай…
Приступая к работе
Итак, wiki требует от нас исполнения трёх требований для того, чтобы успешно собрать PHP на Windows:
- Правильно настроить окружение для того, чтобы можно было скомпилировать код (всякие правильные SDK и тулзы, используемые для компиляции)
- Иметь необходимые при компиляции библиотеки и заголовки для сторонних библиотек
- Иметь исходные коды PHP
Установка окружения
Этот пункт является самым неинтересным. Он потребует установки кучи всякого софта, поэтому потребуется много места под него на Вашем жёстком диске — готовьте гигабайты свободного пространства…
Требования
- Официально PHP поддерживает сборку с помощью Visual C++ 6.0 или Visual C++ 9 (так же известной, как Visual C++ 2008 — смотрите, не запутайтесь). В нашем случае, я пользовался Microsoft Visual C++ 2008 Express Edition
- Для компилятора потребуется ещё Windows SDK правильной версии. При работе с VC9 необходим будет SDK 6.1. Список поддерживаемых версий можно посмотреть на страницах wiki
- В процессе сборки могут потребоваться различные бинарные утилиты, которые можно скачать отсюда: http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip
Установка
Тут всё достаточно просто и понятно:
- Установите скачанную Visual Studio 2008
- Установите Windows SDK 6.1 (тут можно пойти покурить, попить чайку, поморщить кошака — хоть как-то скоротать время, которого может понадобиться много при средней мощности машинки и не очень шутрого инета)
- скачайте php 5.3 snapshot, но пока никуда не распаковывайте. Пригодится
- Создайте папку, где будете заниматься всей предстоящей бесовщиной. Пусть будет
C:\php-sdk
, как предлагает нам wiki… - Распакуйте в эту папку архив binary-tools.zip. Там должно быть 2 папки —
bin
иscript
- Откройте Windows SDK 6.1 CMD Shell (можно найти в установленных программах в меню Пуск) и введите следующие команды:
setenv /x86 /xp /release cd c:\php-sdk\ bin\phpsdk_setvars.bat bin\phpsdk_buildtree.bat php53dev
- Теперь извлеките
snapshot
, о котором говорилось в пункте 3) в папкуC:\php-sdk\php53dev\vc9\x86\
, чтобы получить в итоге следующую директорию:C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME
- Скачайте исходники последней стабильной версии PDO_INFORMIX, распакуйте и скопируйте содержимое папки в архиве в папку
C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME\ext\pdo_informix
- В той же папке, куда Вы распаковывали snapshot (
C:\php-sdk\php53dev\vc9\x86
), находится папкаdeps
, куда необходимо будет сложить все требуемые для сборки файлы. В нашем случае, потребуется из установленного Informix CSDK скопировать содержимое папкиlib
и всех папок папкиincl
(C:\path-to\IBM\Informix\Client-SDK\{lib,incl}
) в папкуC:\php-sdk\php53dev\vc9\x86\deps\lib
иC:\php-sdk\php53dev\vc9\x86\deps\include
соответственно - После всего вышеперечисленного выполните в командной строке следующие команды:
cd C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME buildconf configure --disable-all --enable-pdo --with-pdo-informix=shared="C:\Program Files\IBM\Informix\Client-SDK" --enable-cli
- В папке
C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME\Release_TS
будет лежать заветныйphp_pdo_informix.dll
, который копируйте в папкуext
установленного в системе PHP и прописывайте строчки подключения расширения вphp.ini
:[PHP_PDO_INFORMIX] extension=php_pdo_informix.dll
- Проверяйте наличие расширения, выполнив в командной строке команду
php -m
Развязка + Эпилог
Если честно, для меня было крайне интересно всё это узнать и мало того — сделать. Однако, мне непонятно то, что до всего этого дошло. Почему не получается это сделать идущими в комплекте установки PEAR’ом? Я понимаю, что мало кому интересно поддерживать windows-ветку продукта, который в подавляющем большинстве случаев используется на *nix системах, однако, если уж взялись за поддержку, то и не грех бы и развивать как-то.
Но это так, мысли в слух. А по-существу: получили то, что хотели, оно работает, работа, которую эта проблема сдерживала, продолжается… Да и людям, которые могут столкнуться с подобной проблемой, думаю, может пригодится мой опыт.