Содержание
После работы над очень старым проектом, основанным на PHP 5.3, где для его работы требовалась библиотека APC, я понял, насколько трудно найти расширение APC, чтобы оно работало на платформе Windows. Для Linux этот процесс может быть довольно простым с PECL, однако в Window это было настоящей проблемой.
Вот почему сегодня я собираюсь показать вам, как с нуля компилировать расширение PHP из его исходного кода в среде Windows, в частности с помощью библиотеки APC и PHP 5.3.8.
Требования
- Visual Studio: версия должна обеспечивать некоторую совместимость с принятыми версиями Visual C ++, см. Первый пункт для получения дополнительной информации.
- Исходный код PHP: Исходный код PHP для Windows в версии, которая должна быть совместима с расширением.
- Исходный код расширения: Исходный код расширения для PHP, который вы хотите скомпилировать в динамическую библиотеку (файл DLL).
Сказав это, давайте начнем с компиляции!
1. Подготовьте среду Visual Studio
Прежде чем приступить к компиляции расширения PHP, вы должны знать, что не каждый VS-компилятор совместим с любой версией PHP, поэтому вам нужно знать, какую Visual Studio вам нужно использовать в соответствии с версией PHP, которую вы хотите. скомпилируйте ваше расширение (получите файл DLL). Ознакомьтесь со следующей таблицей, в которой указывается, какая версия Visual Studio необходима для компиляции желаемой версии PHP:
- Да: эта версия поддерживается, и команда PHP предоставляет двоичные файлы, созданные с помощью этого компилятора.
- Нет: не поддерживается
Visual C ++ 6 (только SP6) | да | да | нет | нет | нет | нет | нет | нет | нет |
Visual C ++ 7 / 7.1 (2002, 2003, 2003 + sp1) | Да (**) | Да (**) | нет | нет | нет | нет | нет | нет | нет |
Visual C ++ 8 (VS 2005) | Да (**) | нет | нет | нет | нет | нет | нет | нет | нет |
Visual C ++ 9 (только VS 2008 SP1) | Да (**) | да | да | Да (**) | нет | нет | нет | нет | нет |
Visual C ++ 11 (VS 2012) | нет | нет | Да (**) | да | да | Да (**) | нет | нет | да |
Visual C ++ 14 (VS 2015) | нет | нет | нет | нет | нет | да | Да(**) | Да(**) | да |
Visual C ++ 15 (VS 2017) | нет | нет | нет | нет | нет | Да(**) | Да(**) | да | да |
- (*) Может быть удалено до окончательного выпуска
- (**) Официально не поддерживается, но известно, что работает
- (***) Поддерживается для данного компилятора в соответствии с текущей официальной поддержкой (или известной работой)
Таким образом, чтобы облегчить понимание, если вы хотите скомпилировать расширение для PHP 7, вам потребуется исходный код PHP 7, а также код расширения и, по крайней мере, Visual Studio 2012, предполагающий, что вы хотите скомпилировать его. для PHP 7.0, потому что если вы хотите его для PHP 7.1, то вам понадобится хотя бы Visual Studio 2015.
Зная это, если вы уверены, что у вас правильная версия, у вас не должно возникнуть проблем при компиляции расширения. В противном случае вы столкнетесь со странными исключениями при настройке сборки:
Saving configure options to config.nice.bat
Checking for cl.exe ...
Detected compiler undefined
C:\php-src\configure.js(1817, 9) Microsoft JScript runtime error: 'length' is null or not an object
Заметка
В этом руководстве мы создадим расширение APC для PHP 5.3.8, поэтому в нашем случае нам нужно будет работать с Visual Studio 2008 SP1 для Visual C ++ 9.
2. Откройте командную строку Visual Studio
Чтобы выполнить некоторые административные команды, связанные с разработкой и сборкой вашего расширения, вам потребуется командная строка с контекстом Visual Studio. А именно, Командная строка разработчика для VS, которую вы можете найти по пути:
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\\Visual Studio Tools
Здесь вы найдете исполняемый файл командной строки, который имеет доступ ко всем инструментам, которые вам понадобятся для создания расширения, выполнить его с правами администратора:
Как уже упоминалось, это обычная командная строка, которая содержит инструменты, которые нам нужны для следующих шагов:
Пусть он откроется, как нам нужно в шаге 5.
3. Скачать исходный код PHP
Теперь, когда у вас есть необходимые инструменты для компиляции PHP вместе с вашим расширением, вам также потребуется исходный код PHP. Вы можете получить исходный код нужной вам версии PHP из официальная веб-страница релизов PHP здесь.
Как только вы загрузите tar / zip-файл с кодом, извлеките его в каталог с коротким путем, чтобы избежать проблем с длиной путей в Windows. В нашем случае мы извлечем исходный код PHP 5.3.8 в c:/php-src
каталог:
Мы запустим команды для сборки PHP вместе с вашим кодом в этом каталоге в командной строке позже. Стоит отметить, что папка ext будет содержать код вашего расширения, но мы добавим его на следующем шаге.
4. Подготовьте расширение исходного кода
Чтобы создать свое расширение, либо вы создаете расширение с открытым исходным кодом, либо создаете свое собственное расширение. В нашем случае мы будем строить расширение APC, версия 3.1.6 специально для PHP 5.3.8 (та же версия нашего исходного кода PHP). Это гарантирует, что сгенерированная DLL PHP будет совместима с нужной нам версией PHP.
Как только вы загрузите исходный код вашего расширения (или напишите свой собственный код для него), распакуйте его внутри ext
папка с исходным кодом PHP. В нашем случае каталог для расширения будет c:/php-src/ext/apc
и он будет содержать код расширения (это очень важно, так как расширение будет скомпилировано как динамическая библиотека с PHP):
Также убедитесь, что config.w32
файл в корневом каталоге исходного кода расширения, в строке, которая регистрирует расширение с РАСПРОСТРАНЕНИЕ функция, третий параметр имеет значение true для генерации DLL (динамический режим):
EXTENSION('apc', apc_sources, true);
Потому что, как вы знаете, вы можете интегрировать расширение напрямую с PHP, но в этом уроке мы покажем, как создать файл DLL, который в нашем случае будет php_apc.dll
,
5. Настройте PHP и расширение build
Вернитесь в командную строку разработчика Visual Studio и перейдите в каталог с исходным кодом PHP:
cd c:/php-src
Затем запустите buildconf.bat
файл с --force
аргумент:
buildconf --force
Это создаст новый файл .bat, а именно configure.bat
это будет иметь конфигурацию вашей сборки PHP. Запустите bat с помощью следующей команды и включите расширение, используя --enable-
аргумент. В нашем случае это расширение APC, и мы сохранили исходный код в c:/php-src/ext/apc
каталог, поэтому имя расширения будет APC. Запустите команду, чтобы настроить его:
configure --disable-all --enable-cli --enable-apc
Важная заметка
Если вы выполнили предыдущую команду и столкнулись с исключением, потому что bison.exe не был найден:
- Сохранение параметров конфигурации в config.nice.bat
- Проверка на cl.exe …
- Обнаружен компилятор MSVC9 (Visual C ++ 2008)
- Обнаружен 32-битный компилятор
- Проверка на наличие link.exe … C: \ Program Files (x86) \ Microsoft Visual Studio 9.0 \ VC \ BIN Проверка на наличие nmake.exe …
- Проверка на lib.exe …
- Проверка на bison.exe …
- ОШИБКА: требуется бизон
Загрузите бинарные файлы Bison с сайта Source Forge здесь. Затем вставьте bison.exe а также m4.exe в каталоге bin Visual Studio, например C:\Program Files (x86)\\VC\bin
, Это сделает исполняемый файл зубра доступным для пути, и исключение, которое требуется, зуб больше не будет отображаться.
--disable-all
Флаг поможет нам предотвратить любые другие исключения расширений, которые нам не нужны, просто сосредоточившись на расширении APC, которое нам нужно. И все, вы получите подробный вывод, включающий список со всеми расширениями, которые будут собраны вместе с PHP и его режимом, например, Static (встроенные классы в PHP) или Shared (DLL-библиотека динамических ссылок):
Как и ожидалось, наше расширение PHP будет встроено в файл DLL так, как мы этого хотим. По умолчанию это создаст «потокобезопасную» сборку (PHP 5.3.8 TS). Если вы хотите не-потокобезопасную сборку, просто добавьте --disable-zts
флаг для команды настройки.
6. Сборка PHP и расширение
Наконец, запустите команду nmake, чтобы запустить сборку расширения с помощью PHP в каталоге исходного кода PHP с помощью командной строки разработчика. NMake — это утилита make, предоставляемая Microsoft и доступная в Visual Studio. Это удобный инструмент для создания автоматизированных сборок.
Просто запустите команду:
nmake
Это запустит компиляцию и займет некоторое время. Он также сгенерирует подробный вывод с предупреждениями и т.д .:
Как только он закончится, новый каталог появится внутри c:/php-src
каталог, а именно Release или Release_TS в соответствии с конфигурацией Thread Safety. Там вы найдете очень простую сборку PHP, но наиболее важную причину, почему вы создали исключительно PHP, свой файл DLL расширения (в нашем случае php_apc.dll
):
Спасибо
Эта статья представляет собой повторную сборку нескольких источников, которые могут оказаться полезными при компиляции расширения с открытым исходным кодом или вашего собственного расширения: