Cómo compilar una extensión de PHP (archivo dll) en Windows con Visual Studio

Cómo compilar una extensión de PHP (archivo dll) en Windows con Visual Studio

Despues de trabajar en un antiguo proyecto basado en PHP 5.3 y no podia ser actualizado debido al tamaño de este, la librería APC era requerida para hacerlo funcionar. Al buscar mas información sobre como hacer funcionar un proyecto de este tipo localmente en Windows supe lo dificil que sería intentarlo. En Linux, el proceso llega a ser bastante sencillo con PECL, sin embargo en Windows esto es un problema serio pues el proceso para hacerlo funcionar es extenso.

Por ello en este articulo de enseñaremos a compilar una extensión de PHP desde su código fuente paso a paso en un entorno de Windows, especificamente la extensión que necesite (APC) en PHP 5.3.8.

Requisitos

  • Visual Studio: la versión de visual studio que necesitas para compilar debe ser compatible con la versión aceptada de Visual C++ de PHP, lee mas sobre esto en el primer paso.
  • Código fuente de PHP: necesitarás el código fuente de PHP para Windows en la versión que necesitas para dar compatibilidad a la extensión.
  • Código fuente de la extensión: necesitarás obviamente el código fuente de la extensión de PHP que quieres convertir en una biblioteca de vínculos dinámicos (archivo DLL).

Habiendo dicho esto, vamos a iniciar con la compilación !

1. Preparar entorno de Visual Studio

Antes de comenzar con la compilación de una extensión de PHP, necesitas saber que no cualquier compilador de VS es compatible con cualquier versión de PHP, así que necesitarás saber que versión de Visual Studio usarás de acuerdo a la versión de PHP con la que quieres compilar tu biblioteca de vínculos dinámicos. Lee detalladamente la siguiente tabla que especifica que versión de Visual Studio necesitarás para compilar la versión deseada de PHP:

  • Si: esta versión es soportada y el equipo de PHP provee archivos binarios hechos con este compilador.
  • No: No es soportada
Version de 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 64bits (***)
Visual C++ 6 (SP6 only) Si Si No No No No No No No
Visual C++ 7/7.1 (2002, 2003, 2003+sp1) Si (**) Si (**) No No No No No No No
Visual C++ 8 (VS 2005) Si (**) No No No No No No No No
Visual C++ 9 (VS 2008 SP1 solamente) Si (**) Si Si Si (**) No No No No No
Visual C++ 11 (VS 2012) No No Si (**) Si Si Si (**) No No Si
Visual C++ 14 (VS 2015) No No No No No Si Si (**) Si (**) Si
Visual C++ 15 (VS 2017) No No No No No Si (**) Si (**) Si Si
  • (*) Puede ser abandonado antes del lanzamiento final.
  • (**) No soportado oficialmente pero se sabe que funciona
  • (***) Se admite para este compilador determinado de acuerdo con el soporte oficial actual (o se sabe que funciona)

Para hacer esto fácil de entender, si quieres compilar una extensión para PHP 7, necesitarás el código fuente de PHP 7, el código fuente de la extensión y Visual Studio 2012 asumiendo que quieres compilarla con la versión de PHP 7.0, si deseas esta extensión para PHP 7.1, necesitarias entonces al menos Visual Studio 2015.

Sabiendo esto, si estás seguro de que tienes la versión correcta, no deberías encontrar ningun problema durante la compilación de la extensión. De otra manera encontraras problemas raros durante la configuración de la compilación:

Saving configure options to config.nice.bat
Checking for cl.exe ...  <in default path>
Detected compiler undefined
C:\php-src\configure.js(1817, 9) Microsoft JScript runtime error: 'length' is null or not an object

Nota

En este tutorial compilaremos la extensión APC para PHP 5.3.8, así que necesitamos en nuestro caso para trabajar Visual Studio 2008 SP1 para Visual c++ 9.

2. Ejecuta la consola de comandos de Visual Studio (Command Prompt)

Con el fin de ejecutar algunas tareas administrativas relacionadas al desarrollo y compilación de tu extensión, necesitarás trabajar con la linea de comandos en el contexto de Visual Studio, es decir la consola de desarrolladores de Visual Studio que puedes encontrar en el siguiente directorio:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\<Tu Version de Visual Studio p. ej. 2008 or 2017>\Visual Studio Tools

Aquí encontraras un ejecutable de la linea de comandos que tiene acceso a todas las herramientas necesarias para compilar la extensión, ejecutala con derechos de administrador:

Visual Studio Developer Command Prompt

Como se menciona, es una linea de comandos normal pero con otro contexto, el que tiene las herramientas que necesitamos en los siguientes pasos:

Visual Studio Command Prompt

Dejala abierta pues la necesitaremos en el paso 5.

3. Descarga el código fuente de PHP

Ahora que tienes todas las herramientas necesarias para compilar PHP con tu extensión, necesitarás tambien el código fuente de PHP. Puedes obtenerlo en cualquier versión desde la página de descargas oficiales de PHP aquí.

Una vez descargues el archivo tar/zip con el código, extraelo en un directorio con una dirección corta para prevenir problemas futuros con la longitud de estas en Windows. En nuestro caso, extraeremos el código de PHP 5.3.8 en el directorio c:/php-src :

PHP 5.3.8 Source Code Folder

Ejecutaremos los comandos para compilar PHP con tu extensión en este directorio con la linea de comandos luego. Vale la pena destacar que la carpeta ext contiene el código de tu extensión, pero lo añadiremos en el siguiente paso.

4. Preparar código de extensión PHP

Con el fin de compilar tu extensión, necesitaras el código fuente de esta o escribir tu propio código para ello. En este caso, usaremos el código fuente de la extensión APC, en su versión 3.1.6 especificamente para PHP 5.3.8 (la misma versión del código fuente de PHP). Esto asegurará la compatibilidad del archivo DLL generado con la versión de PHP que necesitas.

Una vez descargues el código fuente de tu extensión o escribas tu propio código de esta, extrae el contenido en la carpeta ext del directorio del código fuente de PHP. En nuestro caso, el directorio de exta extensión sería  c:/php-src/ext/apc y este tendrá el código de la extensión (este es el paso clave pues es muy importante que la extensión sea compilada junto con PHP):

APC DLL Compile in Windows

Debes estar seguro ademas de que el archivo config.w32 en el directorio raiz del código fuente de la extensión, en la linea que registra la extensión con la función de C EXTENSION, el tercer argumento es un booleano verdadero para compilar la extensión como una biblioteca de vinculos dinámicos (archivo DLL):

EXTENSION('apc', apc_sources, true);

Pues como sabras, puedes integrar una extensión directamente con PHP, pero en este tutorial te estamos mostrando como generar un archivo DLL para usarse luego, en nuestro caso sería  php_apc.dll.

5. Configurar compilación de PHP y la Extension

Regresa a la consola de Visual Studio abierta en el paso 2 y cambia al directorio con el código fuente de PHP:

cd c:/php-src

Luego ejecuta el archivo  buildconf.bat con el argumento --force:

buildconf --force

Esto generara un nuevo archivo .bat llamado  configure.bat que tendrá la configuración de tu compilado de PHP. Ejecuta el archivo bat con el siguiente comando y activa tu extensión usando el argumento  --enable-<nombre_carpeta_extension>En nuestro caso, la extensión es APC y guardamos su código fuente en el directorio  c:/php-src/ext/apc asi que el nombre del argumento será APC. Ejecuta el comando para configurar el compilado:

configure --disable-all --enable-cli --enable-apc

Nota importante

Si ejecutas el comando anterior y recibes una excepción porque el ejecutable bison.exe no ha sido encontrado (con el siguiente mensaje):

  • Saving configure options to config.nice.bat
  • Checking for cl.exe ... <in default path>
  • Detected compiler MSVC9 (Visual C++ 2008)
  • Detected 32-bit compiler
  • Checking for link.exe ... C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN Checking for nmake.exe ... <in default path>
  • Checking for lib.exe ... <in default path>
  • Checking for bison.exe ... <not found>
  • ERROR: bison is required

Descarga los binarios de Bison desde el sitio oficial en Source Forge aquí. Luego pega los ejecutable bison.exe y m4.exe en el directorio bin de Visual Studio p. ej C:\Program Files (x86)\<Tu Versión de Microsoft Visual Studio p. ej 9.0>\VC\bin

Esto pondrá el ejecutable a disponiblidad en la consola y la excepción no deberia aparecer más.

El argumento  --disable-all nos ayudará a prevenir la compilación de otras extensiónes innecesarias y nos ahorrára dolores de cabeza, así se enfocará en la extensión deseada. Y eso es todo, así obtendrás información verbosa que incluye una lista con todas las extensiones que serán compiladas junto con PHP y su modo p. ej Static (clases incluidas en PHP) ó Shared (Biblioteca de vinculos dinámicos DLL):

PHP Configure Build

Como esperado, nuestra extensión de PHP será compilada como un archivo DLL exactamente como lo queremos. Por defecto, el comando creará una compilación "Thread Safe" (PHP 5.3.8 TS). Si quieres una compilación Non Thread Safe, simplemente añade el argumento  --disable-zts al comando de configure.

6. Compila PHP y Extensión

Finalmente, solo debes ejecutar el comando nmake para iniciar la compilación de PHP junto con tu extensión dentro del directorio del código fuente de PHP con la linea de comandos de desarrollador de VS. Nmake es una utilidad proporcionada por Microsoft y disponible en Visual Studio. Es una util herramienta para crear compilaciones automatizadas.

Simplemente ejecuta el comando:

nmake

Esto iniciará la compilación y tomará un tiempo hasta que termine. Obtendrás información en la ventana así como alarmas etc:

PHP Cli Built Windows Nmake

Una vez finalice, un nuevo directorio aparecerá dentro del directorio del código fuente de PHP  c:/php-src llamado Release o Release_TS de acuerdo a la configuración de Thread Safety. Allí encontrarás una compilación de PHP bastante básica, pero lo más importante y la razón por la que exclusivamente compilamos PHP, el archivo DLL de nuestra extensión (en nuestro caso  php_apc.dll):

PHP 5.3.8 APC 3.1.6 DLL

Gracias

Este articulo es una recopilación de multiples fuente que probablemente tambien encuentres util durante la compilación de una extensión de código abierto o extensiones propias:

Que te diviertas !

Esto podría ser de tu interes

Conviertete en un programador más sociable