Статьи

Компилировать PHP на Windows

Компиляция PHP из исходного кода чаще выполняется в системах типа Unix. Те, кто работает в среде Windows, чаще загружают и устанавливают PHP из предварительно скомпилированных пакетов. И хотя я не согласен, проще использовать предварительно скомпилированное решение, даже в системах Unix, но есть некоторые преимущества, которые могут возникнуть при компиляции двоичного файла из исходного кода. В общем:

  • У вас есть возможность точно настроить конечный продукт при компиляции. Возможно, вы хотите, чтобы конкретное расширение было скомпилировано непосредственно в двоичный файл, а не загружалось как внешняя библиотека. Или, возможно, вы хотите отключить определенную функцию, которая обычно будет доступна по умолчанию.
  • Вы можете внести изменения в процесс компиляции, если вы так склонны, что может повысить производительность для вашей конкретной среды (конечно, это предполагает, что вы уже знаете, что делаете, и в этом случае вы не будете читать эту статью).
  • Компиляция может быть единственным способом заставить все работать, если предварительно скомпилированные двоичные файлы были созданы на основе более старых версий поддерживающего программного обеспечения и библиотек, чем вы используете в своей системе.

Но будьте осторожны: компиляция может быть неприятной задачей, особенно в Windows! Вы должны убедиться, что ваша среда сборки настроена правильно, узнать, как правильно использовать компилятор и другие инструменты сборки, и удовлетворить любые зависимости библиотеки. Надеюсь, эта статья станет вашим первым шагом в преодолении многих из этих препятствий.

Настройка среды сборки

PHP написан на C, поэтому компилятор C необходим, если вы собираетесь создавать PHP из исходного кода. C ++ — это супер-набор C, поэтому хороший компилятор C ++ также должен уметь компилировать код на C, хотя иногда это не всегда так. Для Windows должно быть достаточно Microsoft Visual C ++ Express (далее я буду называть его VC ++), который можно бесплатно загрузить с веб-сайта Microsoft . Я использую издание 2010 года для этой записи.

При выборе версии компилятора, вы должны иметь в виду, как вы будете использовать PHP. Если вы будете запускать mod_php с официально предварительно скомпилированным двоичным файлом Apache, вам нужно будет скомпилировать PHP с использованием Visual Studio 6, так как это версия, используемая для компиляции Apache. Модуль должен предназначаться для той же самой библиотеки времени выполнения как Apache, в этом случае msvcrt.dll . Если вы собираете Apache из исходного кода или если вы собираетесь запускать PHP как CLI или FastCGI, то это не проблема, и 2010 год будет работать просто отлично.

Вам также нужно будет установить пакет средств разработки программного обеспечения Windows (здесь после SDK). SDK предоставляет нам важные заголовочные файлы для платформы Windows, которые нам понадобятся для успешной компиляции. Это также доступно бесплатно ; Я использую версию 7.1.

Сначала установите компилятор, а затем SDK. Я не буду обсуждать установку, так как у обоих есть графический мастер установки, который проведет вас через процесс.

После того, как вы настроили работающий компилятор, загрузите бинарные инструменты и пакеты deps с windows.php.net/downloads/php-sdk . Пакет бинарных инструментов (я использую архив 20110915) содержит инструменты разработки, такие как re2c, bison и некоторые дополнительные команды, которые понадобятся вам для сборки PHP. Пакет deps (я использую архив 5.4, поскольку он совпадает с версией PHP, которую я буду компилировать) содержит минимальные необходимые заголовочные и библиотечные зависимости, такие как zlib.h

Вероятно, само собой разумеется, что вы также захотите скачать исходный код PHP с windows.php.net/download . На момент написания этой статьи текущая версия PHP была 5.4.6, поэтому номер версии вы увидите в моих примерах.

Хорошая идея — создать рабочую область, в которую вы можете распаковать исходный код и скомпилировать его, не испортив остальную часть вашей системы. Создайте папку C:PHP-Dev которая будет служить рабочим каталогом, а затем распакуйте в нее архив бинарных инструментов.

Затем извлеките содержимое исходного архива PHP в C:PHP-Dev чтобы у вас там php5.4 исходная папка php5.4 , а затем извлеките архив deps в deps папку deps . Ваша структура каталогов должна выглядеть примерно так:

Откройте командную строку Windows SDK, которая была установлена ​​вместе с SDK (Пуск> Microsoft Windows SDK> Командная строка Windows SDK), и выполните следующие команды:

  setenv / release / xp / x86
 CD C: PHP-Dev
 binphpsdk_setvars.bat 

Использование консоли командной строки SDK желательно по сравнению с обычной консолью cmd.exe как она устанавливает множество переменных среды, специфичных для компиляции исходного кода. Команды компиляции позже также должны быть выполнены в этой консоли.

Флаги для setenv устанавливают некоторые свойства сборки для среды; В этом случае я настроил среду для сборки 32-разрядной версии Windows XP. Вы можете попробовать и собрать с /x64 если вы чувствуете себя предприимчивым, но с этим все еще есть некоторые проблемы. Указание разных версий Windows, таких как /vista , скорее всего, приведет к проблемам из-за некоторых странных определений в скриптах сборки (PHP по-прежнему стремится быть XP-совместимым). Если вы действительно не знаете, что делаете, возможно, безопаснее всего придерживаться рекомендованных значений, которые я использовал выше.

phpsdk_setvars.bat скрипт phpsdk_setvars.bat устанавливает некоторые дополнительные переменные окружения, чтобы процесс сборки мог найти бинарные инструменты.

Имейте в виду, что все эти переменные настройки только временно для сеанса вашей консоли. Если вы закроете приглашение и вернетесь к компиляции позже, вам нужно будет снова запустить команды. Если вы этого не сделаете, вы получите ошибки, подобные следующим, когда вы запустите configure позже и не сможете продолжить:

  Проверка на bison.exe ... <не найдено>
 ОШИБКА: требуется бизон 

Убедиться, что у вас есть правильная среда сборки, необходимые источники и любые зависимости, является самой сложной частью процесса. Итак, теперь, когда ваша среда настроена, а исходный код и зависимости на своем месте, пришло время для компиляции!

Компиляция PHP

В командной buildconf SDK перейдите к исходной папке PHP и запустите buildconf . Команда отвечает за генерацию файла конфигурации, который создаст Makefile для запуска процесса компиляции.

После завершения buildconf (это займет всего секунду), запустите configure --help и проверьте, какие функции вы хотите включить / отключить, а затем снова запустите configure с любыми желаемыми параметрами. Хорошей идеей будет проверить вывод, прежде чем двигаться дальше, поскольку он предупредит вас, если какая-либо из необходимых зависимостей недоступна. Если это произойдет, вы можете либо установить зависимости и повторно запустить configure либо настроить вызов, чтобы отключить расширения, для которых они требуются.

Наконец, запустите nmake чтобы запустить компиляцию.

  CD C: PHP-Devphp5.4
 buildconf
 настроить
 NMAKE
 тест Nmake 

В случае сбоя configure или nmake существует вероятность того, что проблема заключается в одном из двух: 1) ваша среда настроена неправильно или 2) вы включили функцию, которая зависит от внешней библиотеки, и библиотека не установлена в вашей системе. Дважды проверьте, что вы настроили среду в соответствии с инструкциями, приведенными выше, и что все дополнительные библиотеки, которые могут потребоваться в зависимости от параметров конфигурации, были установлены.

Когда первый nmake компиляции nmake завершится, вы найдете новые блестящие бинарные файлы PHP в папке Release_TS . nmake test запускает новые двоичные файлы через ряд тестов ошибок, чтобы убедиться, что все работает так, как должно быть. Результаты nmake test передаются команде QA, которая зависит от них, чтобы улучшить PHP, поэтому, хотя запуск может занять несколько минут, это ответственная вещь.

На этом этапе вы также можете выполнить дополнительный шаг запуска nmake snap который создаст ZIP-архивы с двоичными файлами, которые вы можете скопировать.

Компиляция расширений

Есть два способа компилировать расширения PHP: статически и динамически. Статически скомпилированное расширение компилируется в сам двоичный файл PHP, тогда как динамически скомпилированное расширение представляет собой отдельную DLL, которая может быть загружена позже через файл php.ini . Расширения обычно компилируются как DLL, хотя есть и некоторые преимущества для статической компиляции; в конечном итоге это зависит от ваших потребностей.

Чтобы скомпилировать расширения PHP в Windows, извлеките папку с исходным кодом расширения в папку ext вашей исходной директории PHP. Затем buildconf --force скрипт configure, запустив buildconf --force и перекомпилируйте PHP, используя соответствующие флаги, чтобы включить расширение.

В качестве примера давайте статически скомпилируем расширение AOP. Загрузите исходный код из PECL и распакуйте его папку в ext . Затем выполните следующее:

  CD C: PHP-Devphp5.4
 buildconf --force
 настроить --enable-aop
 NMAKE 

Опция buildconf для buildconf заставляет его перестраивать конфигурационные сценарии. После этого запустите configure --help и вы должны увидеть возможность включить новое расширение в вывод. В данном случае это --enable-aop .

Когда nmake finishes , у вас будет только что созданный двоичный файл PHP с расширением AOP.

Если вы хотите, чтобы расширение было доступно как DLL, а не запрограммировано в PHP, вы можете выполнить те же шаги, что и выше, но указать «shared» в качестве значения для настройки опции enable.

  buildconf --force
 настроить --enable-aop = расшаренный 

Полученная DLL будет находиться в папке Release_TS вместе с двоичным Release_TS PHP после завершения компиляции, в данном случае с именем php_aop.dll .

Компиляция в Windows все еще немного сложна, особенно когда речь идет о расширениях. Версия phpize для phpize кажется, сломана, и я до сих пор не мог скомпилировать DLL после этого, очень похоже на то, как это делает PECL. За последние пять лет команда PHP сделала огромный шаг к тому, чтобы сделать PHP таким же замечательным в Windows, как и в Unix, так что, надеюсь, недостатки и морщины будут устранены вовремя. А пока я рекомендую компилировать PHP и ваши общие DLL одновременно.

Резюме

Умение компилировать исходный код — это хороший навык, особенно если вы позже захотите изменить PHP. Возможно, вы хотите добавить новую функциональность, создать ссылку на новую библиотеку или просто стать следующим великим разработчиком ядра PHP (они всегда могут воспользоваться помощью!). И теперь, когда вы знаете, как, смело взламывать и строить!

Изображение через Fotolia