По просьбам трудящихся как обычно в стиле как для полных дэбилов (в хорошем смысле) пишем про компиляцию своего РНР с дополнительными 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, то нам желательно неуклонно следовать всем приведённым здесь рекомендациям без исключения! Для начала компиляции нам потребуются:
- Microsoft Visual C++, PHP официально поддерживает сборку в Visual C++ 6.0 или в Visual C++ 9 (2008). Вы можете использовать Express версию если пожелаете. MinGW и другие компиляторы официально не поддерживаются, хотя возможно работают. Для получения более подробной информации о поддерживаемых компиляторах для сборки сотрите здесь: https://wiki.php.net/internals/windows/compiler
- Правильный Windows SDK или Platform SDK подходящий для вашей платформы (версии ОС). ВНИМАНИЕ! Windows SDK содержит в себе дополнительные компоненты такие как например Microsoft Visual C++ Compilers 2008 Standard Edition которые возможно были установлены ранее вместе с другими продуктами Microsoft! Перед удалением Windows SDK рекомендуется ознакомится с Troubleshooting: Uninstall SDK components!
- Дополнительные библиотеки и утилиты, смотреть сюда http://windows.php.net/downloads/php-sdk/ для получения бинарных версий.
- Включенный 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.
- 1 GB свободного места на жестком диске под РНР библиотеки, исходники РНР и компиляцию РНР кода, а ещё лучше иметь 1.5-2 ГБ свободного места на жестком диске!
Итак, начнём... Устанавливаем Windows SDK, Visual C++ 6.0 или Visual C++ 9 (2008) и обновляем его:
- Windows SDK for Server 2008 (v6.1)
- 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 - 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)"
- Обновление для Microsoft Visual Studio 2008 - Обновление системы безопасности для редактора XML Microsoft Visual Studio 2008 с пакетом обновления 1 (SP1) VS90SP1-KB2251487-x86.exe
- Обновление для 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
Ссылки по теме:
- Установка PHP-расширения в Windows
- Build your own PHP on Windows
- Windows Specific Internals Docs
- WinCache Building for Windows
- Talking to the Windows build system: config.w32
- WinSDK bug notification: SDK Config Tool appears to work but fails
- Компиляция разделяемых расширений с помощью phpize
- Компиляция расширений 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).