Компиляция своего РНР 5.4 с дополнительными PECL расширениями (модулями) в Windows

archive view archive save

Компиляция своего РНР 5.4 с дополнительными PECL расширениями (модулями) в Windows По просьбам трудящихся как обычно в стиле как для полных дэбилов (в хорошем смысле) пишем про компиляцию своего РНР с дополнительными PECL расширениями под Windows. Обычно PECL расширения (модули) можно найти в сети в уже скомпилированном виде.

Потому как из репозитория pecl.php.net РНР PECL расширения (модули) распространяются в виде исходных кодов, то в ОС Windows способ установки РНР PECL расширений (модулей) при помощи консольных команд типа pecl install pecl_mod_name не канает и хорошо подходит только для ОС семейства UNIX где эта команда, загрузив расширение, автоматически запускает процесс сборки и компиляции PECL расширения (модуля) с дальнейшей его установкой.

Возможно при помощи каких-то хитросплетений с компиляторами возможна автоматическая установка PECL расширения (модуля) командой pecl install pecl_mod_name и в ОС Windows но, увы пока эта возможность официально не задокументирована и автор сего поста с данным способом не осведомлен, а поэтому велосипед строить мы не станем и вам не советуем. Лучшим вариантом будет поиск в гугле уже готовых скомпилрованных PECL расширений (модулей).

Кое какие уже готовые скомпилированные PECL расширения (модули) для Windows можно попытаться обнаружить по этим адресам:

ВОПРОС: Какие именно расширения мне нужно устанавливать?, ведь там много вариантов PECL расширений для Windows с разными приставками - _ts, _nts, core?

ОТВЕТ: Нужный вам вариант PECL расширения для Windows, зависит от того, какая версия РНР ts или nts у вас установлена! ts означает "thread safe", nts значит "not thread safe". Версия РНР "not thread safe" обычно подходит для IIS сервера, а "thread safe" для веб-сервера Apache. Определить какая у вас версия РНР "thread safe" или РНР "not thread safe" можно по наличию в корне каталога с РНР библиотеки php5ts.dll, если библиотека php5ts.dll присутствует в корне каталога с РНР, то значит у вас "thread safe" версия. Обычно для установки оптимально подходит PECL расширение для Windows помеченное как "core".

Только в случае если мы не обнаружили в сети Интернет нужного нам PECL расширения для Windows в уже готовом скомпилированном виде, то только в этом случае оправданы кванты ЦП и чело.часы затрачиваемые на компиляцию PECL расширения.

Перед началом компиляции рекомендуется затарится пивом, пиццей и прочими веществами поддерживающими жизнь в организме, так как установка всего нужного "добра" и последующая компиляция отнимет много времени.

Компиляция РНР + PECL расширения PHP APC-3.1.9 в Windows XP

По большому счету эта статья перевод с "вражеского" статьи Build your own PHP on Windows с некоторыми комментариями и дополнениями.

Если мы хотим избежать появления фатальных геморроев в процессе компиляции РНР + PECL под Windows, то нам желательно неуклонно следовать всем приведённым здесь рекомендациям без исключения! Для начала компиляции нам потребуются:

  1. Microsoft Visual C++, PHP официально поддерживает сборку в Visual C++ 6.0 или в Visual C++ 9 (2008). Вы можете использовать Express версию если пожелаете. MinGW и другие компиляторы официально не поддерживаются, хотя возможно работают. Для получения более подробной информации о поддерживаемых компиляторах для сборки сотрите здесь: https://wiki.php.net/internals/windows/compiler
  2. Правильный Windows SDK или Platform SDK подходящий для вашей платформы (версии ОС). ВНИМАНИЕ! Windows SDK содержит в себе дополнительные компоненты такие как например Microsoft Visual C++ Compilers 2008 Standard Edition которые возможно были установлены ранее вместе с другими продуктами Microsoft! Перед удалением Windows SDK рекомендуется ознакомится с Troubleshooting: Uninstall SDK components!
  3. Дополнительные библиотеки и утилиты, смотреть сюда http://windows.php.net/downloads/php-sdk/ для получения бинарных версий.
  4. Включенный Windows Script Host. Если Windows Script Host отключен, то при выполнении buildconf получим CScript Error: Windows Script Host access is disabled on this machine. Contact your administrator for details. Включаем, если Windows Script Host отключен, в реестре установкой значения 1, параметра Enabled, в ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings.
  5. 1 GB свободного места на жестком диске под РНР библиотеки, исходники РНР и компиляцию РНР кода, а ещё лучше иметь 1.5-2 ГБ свободного места на жестком диске!

Итак, начнём... Устанавливаем Windows SDK, Visual C++ 6.0 или Visual C++ 9 (2008) и обновляем его:

  1. Windows SDK for Server 2008 (v6.1)
  2. Visual Studio 2008 Software Development Kit (SDK) - на всяк случай, только если у вас Visual Studio 2008 Standard, а не Express!

    АХТУНГ! ВНИМАНИЕ! ВАЖНО!!! Installing Windows SDK for Server 2008 (v6.1) after VS2008 SP1 causes conflicts with Security Update (KB971092). Т.е. установка Windows SDK for Server 2008 после установки VS2008 SP1, вызывает конфликты с обновлением KB971092. Другими словами - установите сначала Windows SDK for Server 2008, а потом уже устанавливайте Visual Studio 2008, обновите Visual Studio до VS2008 SP1! Запуск средства "Заменить" из панели "Установка/удаление программ" для Windows SDK вернет предыдущее состояние должно предотвращаться (http://blogs.msdn.com/b/windowssdk/archive/2009/08/07/windows-sdk-for-server-2008-v6-1-overwrites-vs2008-sp1-crt-files.aspx)! Перед установкой Visual Studio 2008 следует удалить предыдущие версии Visual Studio! При удалении Microsoft Visual J# 2005 Express Edition и Microsoft Web Deweloper 2005 может образоваться геморрой и воизбежание геморроя рекомендуется перед удалением читать сюда: Microsoft Visual J# .NET does not appear in Add or Remove Programs after you upgrade from Windows 98 or Windows Millennium Edition, Problems uninstalling Visual Web Developer 2005 Express Edition
  3. Microsoft Visual Studio 2008 Express Edition (819 MB - Русский) или "Microsoft Visual Studio 2008 Express Edition (3.0 GB - Русский. Also included is SQL Server 2005 Compact Edition, SQL Server 2005 Express Edition and MSDN Express documentation.)" он же "Microsoft Visual Studio 2008 с пакетом обновления 1 (SP1)"
  4. Обновление для Microsoft Visual Studio 2008 - Обновление системы безопасности для редактора XML Microsoft Visual Studio 2008 с пакетом обновления 1 (SP1) VS90SP1-KB2251487-x86.exe
  5. Обновление для SQL Server что был в составе Microsoft Visual Studio 2008 (если устанавливали) - SQL Server 2008 с пакетом обновления 3 (SP3) - SQLServer2008SP3-KB2546951-x86-RUS.exe

Компиляция РНР 5.4 в Windows XP

После установки основного софта и библиотек можно браться непосредственно за сам РНР. Отсюда http://windows.php.net/downloads/php-sdk/ скачиваем deps-5.4-vc9-x86.7z и php-sdk-binary-tools-20110915.zip:

Скачиваем исходники, так называемый снапшот, активно (почти ежедневно) развивающаяся типа ветвь РНР, отсюда http://snaps.php.net/ или скачиваем стабильные и проверенные исходники РНР отсюда http://windows.php.net/download/. Мы предпочли стабильную версию src:

  • php-5.4.4-src.zip

Создадим каталог C:\php-sdk и распакуем туда php-sdk-binary-tools-20110915.zip так, чтобы получить древо каталогов:

    C:\php-sdk
        \bin
        \script
        \share

Запускаем "windows sdk 6.1 shell" (ака CMD Shell.lnk), входящий в состав Windows SDK, и переходим в cd /d C:\php-sdk\ где выполняем:

vcvars32
setenv /x86 /xp /release
bin\phpsdk_setvars.bat
bin\phpsdk_buildtree.bat php54dev

После выполнения команды bin\phpsdk_buildtree.bat php54dev в директории C:\php-sdk\php54dev будет нарисовано древо каталогов:

    C:\php-sdk\php54dev\
        VC6\
            x64\
                deps\
                    bin\
                    include\
                    lib\
            x86\
                deps\
                    bin\
                    include\
                    lib\
    C:\php-sdk\php54dev\
        VC8\
            x64\
                deps\
                    bin\
                    include\
                    lib\
            x86\
                deps\
                    bin\
                    include\
                    lib\
    C:\php-sdk\php54dev\
        VC9\
            x64\
                deps\
                    bin\
                    include\
                    lib\
            x86\
                deps\
                    bin\
                    include\
                    lib\

Перемещаемся в каталог C:\php-sdk\php54dev\VC9\x86 и распаковываем туда deps-5.4-vc9-x86.7z, php-5.4.4-src.zip, а также дополнительно создадим каталог pecl и распакуем туда исходники APC-3.1.9.tgz от 2011-05-14, в результате должны получить древо каталогов:

    C:\php-sdk\php54dev\
        VC9\
            ......
            x86\
                deps\
                    bin\
                    include\
                    lib\
                pecl\
                    apc\
                        tests\
                        ......
                php-5.4.4-src\
                    build\
                    ext\
                    ......

Теперь переходим непосредственно к компиляции PHP 5.4:

:: generating configure script
buildconf
:: configure script help
configure --help
configure --disable-all --enable-cli
:: compile PHP
nmake

Компиляция PECL расширения APC-3.1.9 в PHP под Windows XP

Когда PHP 5.4 уже откомпилирован, самое время перейти к компиляции PECL расширения APC-3.1.9 в PHP под Windows. PECL расширение APC-3.1.9 уже было ранее загружено и распаковано в каталог C:\php-sdk\php54dev\VC9\x86\pecl\apc.

Теперь для компиляции PECL расширения APC для PHP 5.4 нам достаточно выполнить:

buildconf
configure --enable-cli --enable-apc=shared
nmake

Опция shared в параметре --enable-apc указывает на то, что на выходе нам нужна динамическая библиотека (dll), а не статическая (lib) которые предпочитаются по умолчанию!

Существует два типа библиотек: компонуемые динамически (dll) и статически (lib). shared - это просто свойство dll. Если используется библиотека двумя или более процессами, то она разделяема. Другое дело - поддерживает ли она множество клиентов. Статические библиотеки, после компоновки "находящиеся" в том же модуле, что и клиент, не могут быть разделяемы по определению.

Если у PECL расширения имеются/требуются зависимости от сторонних библиотек, то следует использовать опцию подобную этой --with-extname=shared="C:\pathto\Client-SDK", подробности смотрите в справке к каждому конкретному PECL расширению.

Скомпилированый PHP модуль PECL APC (php_apc.dll) можно найти в каталоге C:\php-sdk\php54dev\vc9\x86\php-5.4.4-src\Release_TS\.

Если мы хотим распространять скомпилированый нами PHP 5.4, то под занавес мы должны выполнить команду nmake snap

С подключением PECL APC модуля я думаю геморроя быть не должно. Просто копируем php_apc.dll в каталог расширений с рабочим PHP (обычно ext), добавляем в php.ini строку extension=php_apc.dll и перезапускаем веб-сервер.

Если PECL APC модуль был скомпилирован статически (lib), то проверить его наличие можно так:

cd C:\php-sdk\php54dev\vc9\x86\php-5.4.4-src\Release_TS\
.\php -m

Проверить загружен ли PECL APC модуль:

!--?php 
    phpinfo();
?>
 
или
 
php.exe -i

Ссылки по теме:

  1. Установка PHP-расширения в Windows
  2. Build your own PHP on Windows
  3. Windows Specific Internals Docs
  4. WinCache Building for Windows
  5. Talking to the Windows build system: config.w32
  6. WinSDK bug notification: SDK Config Tool appears to work but fails
  7. Компиляция разделяемых расширений с помощью phpize
  8. Компиляция расширений PECL статически в PHP

Известные ошибки при использовании APC

PHP Fatal error: Unknown: apc_fcntl_unlock failed

После подключения/установки php_apc и перезапуска Apache, при попытке отобразить РНР или ХТМЛ файл сервер не отвечает, а в файл error.log Apache пишет: [Sat Jul 21 06:58:04 2012] [error] [client 127.0.0.1] PHP Fatal error: Unknown: apc_fcntl_unlock failed errno:6 in Unknown on line 0

А при попытке вручную завершить процес Apache (httpd.exe) выдаётся сообщение: Всплывающее окно приложения: httpd.exe - Ошибка приложения : Инструкция по адресу "0x01f40633" обратилась к памяти по адресу "0x0233511c". Память не может быть "read". "ОК" -- завершение приложения "Отмена" -- отладка приложения

Эта ошибка обсуждалась на bugs.php.net. Ошибка PHP Fatal error: Unknown: apc_fcntl_unlock failed решается перекомпиляцией php_apc с опциями для Unix:

 

Перекомпиляция php_apc с опциями в Windows:

 

Перезапустите Apache, php_apc должен заработать. Если перекомпиляция не устранила ошибку, то проверьте соответствует ли версия исходных кодов РНР, под которыми компилировался php_apc.dll, версии РНР под которым фактически используется php_apc.dll или возьмите во внимание указанное ниже замечание!

ВНИМАНИЕ! php_apc 3.1.9 в связке с Apache 2.2.x + PHP 5.4.5 работает некорректно и сервер Apache (httpd.exe) падает выдавая мессагу типа: httpd.exe - Ошибка приложения : Инструкция по адресу "0x01f40633" обратилась к памяти по адресу "0x0233511c". Память не может быть "read". С Apache 2.2.x + PHP 5.4.5 неплохо работает php_apc 3.1.10 (beta) или php_apc 3.1.11 (beta).

Автор: Олег Головский


Об авторе
АдМинь БагоИскатель
АдМинь БагоИскатель ярый борец за безглючную работу любых механизмов и организмов во всей вселенной и потому пребывает в вечном поиске всяческих багов, а тот кто ищет как известно всегда находит. Когда что-то или кого-то вылечить не в состоянии, то со словами "Я в аду, а вы все черти" уходит в запой выйдя из которого снова берётся лечить неизлечимое.
Ещё статьи автора
Комментарии в блоге
Новое на форуме