Сборка и установка расширений для PHP (extentions) в Windows среде

20 сентября 2010 г.

Если Вы столкнулись с необходимостью подключения в 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)

Итак, задача в целом выглядит так:

  1. скачать и установить php (если не установлен)
  2. скачать и установить Informix Client SDK (Informix CSDKF)
  3. скачать исходники php и pdo_informix и собрать из них php
  4. извлечь из собранного релиза расширение php_pdo_informix.dll и подключить его в установленную версию PHP
  5. работать

Далее я приведу выдержку-перевод-адаптацию статьи из php wiki, посвящённую сборке PHP на Windows, исполненную под наш конкретный случай…

Приступая к работе

Итак, wiki требует от нас исполнения трёх требований для того, чтобы успешно собрать PHP на Windows:

  1. Правильно настроить окружение для того, чтобы можно было скомпилировать код (всякие правильные SDK и тулзы, используемые для компиляции)
  2. Иметь необходимые при компиляции библиотеки и заголовки для сторонних библиотек
  3. Иметь исходные коды PHP

Установка окружения

Этот пункт является самым неинтересным. Он потребует установки кучи всякого софта, поэтому потребуется много места под него на Вашем жёстком диске — готовьте гигабайты свободного пространства…

Требования

  1. Официально PHP поддерживает сборку с помощью Visual C++ 6.0 или Visual C++ 9 (так же известной, как Visual C++ 2008 — смотрите, не запутайтесь). В нашем случае, я пользовался Microsoft Visual C++ 2008 Express Edition
  2. Для компилятора потребуется ещё Windows SDK правильной версии. При работе с VC9 необходим будет SDK 6.1. Список поддерживаемых версий можно посмотреть на страницах wiki
  3. В процессе сборки могут потребоваться различные бинарные утилиты, которые можно скачать отсюда: http://pecl2.php.net/downloads/php-windows-builds/php-libs/binary-tools.zip

Установка

Тут всё достаточно просто и понятно:

  1. Установите скачанную Visual Studio 2008
  2. Установите Windows SDK 6.1 (тут можно пойти покурить, попить чайку, поморщить кошака — хоть как-то скоротать время, которого может понадобиться много при средней мощности машинки и не очень шутрого инета)
  3. скачайте php 5.3 snapshot, но пока никуда не распаковывайте. Пригодится
  4. Создайте папку, где будете заниматься всей предстоящей бесовщиной. Пусть будет C:\php-sdk, как предлагает нам wiki…
  5. Распакуйте в эту папку архив binary-tools.zip. Там должно быть 2 папки — bin и script
  6. Откройте Windows SDK 6.1 CMD Shell (можно найти в установленных программах в меню Пуск) и введите следующие команды:
    setenv /x86 /xp /release
    cd c:\php-sdk\
    bin\phpsdk_setvars.bat
    bin\phpsdk_buildtree.bat php53dev
  7. Теперь извлеките snapshot, о котором говорилось в пункте 3) в папку C:\php-sdk\php53dev\vc9\x86\, чтобы получить в итоге следующую директорию: C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME
  8. Скачайте исходники последней стабильной версии PDO_INFORMIX, распакуйте и скопируйте содержимое папки в архиве в папку C:\php-sdk\php53dev\vc9\x86\php5.3-SNAPSHOTTIME\ext\pdo_informix
  9. В той же папке, куда Вы распаковывали 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 соответственно
  10. После всего вышеперечисленного выполните в командной строке следующие команды:
    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
  11. В папке 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
  12. Проверяйте наличие расширения, выполнив в командной строке команду php -m

Развязка + Эпилог

Если честно, для меня было крайне интересно всё это узнать и мало того — сделать. Однако, мне непонятно то, что до всего этого дошло. Почему не получается это сделать идущими в комплекте установки PEAR’ом? Я понимаю, что мало кому интересно поддерживать windows-ветку продукта, который в подавляющем большинстве случаев используется на *nix системах, однако, если уж взялись за поддержку, то и не грех бы и развивать как-то.

Но это так, мысли в слух. А по-существу: получили то, что хотели, оно работает, работа, которую эта проблема сдерживала, продолжается… Да и людям, которые могут столкнуться с подобной проблемой, думаю, может пригодится мой опыт.

Теги: рубрика PHP, Windows