Как скомпилировать расширение PHP (файл DLL) в Windows с помощью Visual Studio

После работы над очень старым проектом, основанным на 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 предоставляет двоичные файлы, созданные с помощью этого компилятора.
  • Нет: не поддерживается
Версия PHP
5.2.x
5.3.x
5.4.x
5.5.x
5.6.x
7.0.x
7.1.x
7.2.x
64 бит (***)
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

Здесь вы найдете исполняемый файл командной строки, который имеет доступ ко всем инструментам, которые вам понадобятся для создания расширения, выполнить его с правами администратора:

Командная строка разработчика Visual Studio

Как уже упоминалось, это обычная командная строка, которая содержит инструменты, которые нам нужны для следующих шагов:

Командная строка Visual Studio

Пусть он откроется, как нам нужно в шаге 5.

3. Скачать исходный код PHP

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

Как только вы загрузите tar / zip-файл с кодом, извлеките его в каталог с коротким путем, чтобы избежать проблем с длиной путей в Windows. В нашем случае мы извлечем исходный код PHP 5.3.8 в c:/php-src каталог:

PHP 5.3.8 Папка с исходным кодом

Мы запустим команды для сборки PHP вместе с вашим кодом в этом каталоге в командной строке позже. Стоит отметить, что папка ext будет содержать код вашего расширения, но мы добавим его на следующем шаге.

4. Подготовьте расширение исходного кода

Чтобы создать свое расширение, либо вы создаете расширение с открытым исходным кодом, либо создаете свое собственное расширение. В нашем случае мы будем строить расширение APC, версия 3.1.6 специально для PHP 5.3.8 (та же версия нашего исходного кода PHP). Это гарантирует, что сгенерированная DLL PHP будет совместима с нужной нам версией PHP.

Как только вы загрузите исходный код вашего расширения (или напишите свой собственный код для него), распакуйте его внутри ext папка с исходным кодом PHP. В нашем случае каталог для расширения будет c:/php-src/ext/apc и он будет содержать код расширения (это очень важно, так как расширение будет скомпилировано как динамическая библиотека с PHP):

APC DLL Компиляция в Windows

Также убедитесь, что 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 Configure Build

Как и ожидалось, наше расширение PHP будет встроено в файл DLL так, как мы этого хотим. По умолчанию это создаст «потокобезопасную» сборку (PHP 5.3.8 TS). Если вы хотите не-потокобезопасную сборку, просто добавьте --disable-zts флаг для команды настройки.

6. Сборка PHP и расширение

Наконец, запустите команду nmake, чтобы запустить сборку расширения с помощью PHP в каталоге исходного кода PHP с помощью командной строки разработчика. NMake — это утилита make, предоставляемая Microsoft и доступная в Visual Studio. Это удобный инструмент для создания автоматизированных сборок.

Просто запустите команду:

nmake

Это запустит компиляцию и займет некоторое время. Он также сгенерирует подробный вывод с предупреждениями и т.д .:

PHP Cli Встроенный Windows Nmake

Как только он закончится, новый каталог появится внутри c:/php-src каталог, а именно Release или Release_TS в соответствии с конфигурацией Thread Safety. Там вы найдете очень простую сборку PHP, но наиболее важную причину, почему вы создали исключительно PHP, свой файл DLL расширения (в нашем случае php_apc.dll):

PHP 5.3.8 APC 3.1.6 DLL

Спасибо

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

Ссылка на основную публикацию
Adblock
detector