En resumen: compilar PHP significa descargar el paquete oficial de código fuente de php.net, fijar con ./configure las interfaces y extensiones deseadas, construir con make, comprobar con make test y después instalar. Esto da control total sobre la versión y el alcance. El precio: usted es responsable de cada actualización de seguridad, como ocurrió hace poco con PHP2Shell, cuando hubo que reconstruir y reiniciar todos los procesos.
Cuándo tienen sentido los builds propios de PHP
La mayoría de los servidores obtienen PHP de una fuente de paquetes: de la distribución de Linux, de un repositorio de terceros o mediante una imagen de contenedor. Para el funcionamiento normal suele ser la mejor opción, porque las correcciones de seguridad se suministran de forma automática.
Los builds propios tienen, aun así, su lugar:
| Situación | Fuente de paquetes | Build propio |
|---|---|---|
| Servidor web normal | suele ser mejor | rara vez necesario |
| Versión u opción no disponible en una fuente de confianza | no disponible | con sentido |
| Depuración del propio PHP, build de depuración | limitado | con sentido |
| Alcance funcional mínimo para sistemas especiales | limitado | con sentido |
| Actualizaciones de seguridad | llegan con la fuente | tarea propia |
Quien opta por builds propios necesita un proceso fijo de actualizaciones; de lo contrario, la ventaja se convierte en riesgo.
Requisitos
Según el manual se necesitan GNU make y un compilador de C; desde PHP 8.4, el compilador debe admitir C11. Quien construye desde el repositorio de Git en lugar de un paquete de versión necesita además autoconf (desde 2.68), re2c (desde 1.0.3 para PHP 8.3 y posteriores) y bison (desde 3.0.0). El README del código fuente indica para Ubuntu esta entrada:
sudo apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev
Para cada extensión adicional se suman los paquetes de desarrollo correspondientes, por ejemplo para OpenSSL o libsodium.
Descargar el código fuente y comprobar su autenticidad
Un PHP compilado por uno mismo es tan fiable como su código fuente. php.net ofrece cada paquete con suma de verificación SHA-256 y firma GPG; las claves de los release managers figuran en la página de descargas y en la página de claves GPG.
curl -O https://www.php.net/distributions/php-8.4.27.tar.xz
curl -O https://www.php.net/distributions/php-8.4.27.tar.xz.asc
sha256sum php-8.4.27.tar.xz # comparar con el valor de php.net
gpg --verify php-8.4.27.tar.xz.asc php-8.4.27.tar.xz
Solo cuando la suma de verificación y la firma coinciden se continúa.
Compilar PHP: configure, make, test
El proceso tiene cuatro pasos:
- Configurar:
./configurecon las opciones deseadas. Si se construye desde Git, ejecutar antes./buildconf. - Construir:
make -j"$(nproc)"; según el README, lo razonable es que el número de trabajos coincida con el de núcleos del procesador. - Probar:
make TEST_PHP_ARGS=-j4 testejecuta el conjunto de pruebas de PHP. - Instalar:
make install, según el directorio de destino con derechos de root.
Un ejemplo de build de PHP-FPM con directorio de destino propio:
tar xf php-8.4.27.tar.xz && cd php-8.4.27
./configure --prefix=/opt/php-8.4 \
--with-config-file-path=/opt/php-8.4/etc \
--enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data --with-fpm-systemd \
--with-openssl --with-sodium \
--disable-cgi
make -j"$(nproc)"
make TEST_PHP_ARGS=-j4 test
sudo make install
/opt/php-8.4/bin/php -v
Las opciones más importantes de un vistazo:
| Opción | Efecto |
|---|---|
--enable-fpm |
construye PHP-FPM; además --with-fpm-user, --with-fpm-group, --with-fpm-systemd |
--with-config-file-path |
directorio donde PHP busca el php.ini |
--with-openssl |
compatibilidad con OpenSSL; desde PHP 7.4 la ruta se encuentra mediante pkg-config |
--with-sodium |
criptografía moderna con libsodium |
--disable-cgi |
prescinde de la variante CGI si no se necesita |
--enable-debug |
símbolos de depuración; según el README, recomendado para desarrollo, no para producción |
--enable-zts |
seguridad de hilos para modos de funcionamiento con hilos |
Con --prefix se pueden instalar en paralelo varias versiones compiladas por uno mismo, por ejemplo en /opt/php-8.3 y /opt/php-8.4. Esto facilita los cambios, pero exige disciplina: cada versión instalada es un software propio que debe reconstruirse con cada versión de seguridad, aunque en ese momento ningún sitio web la utilice. Los builds que ya no se necesitan deben eliminarse por completo. Qué opciones tiene un build existente lo muestra php -i en la línea «Configure Command»; es la mejor plantilla para la siguiente reconstrucción.
Nota sobre OPcache: desde PHP 8.5, OPcache está compilado de forma permanente según el RFC aprobado. En versiones anteriores se construye como extensión y se carga mediante zend_extension. Qué son las extensiones y las interfaces lo explican Entender las extensiones de PHP y SAPI explicada.
Builds propios y seguridad: las obligaciones tras PHP2Shell
El PHP compilado por uno mismo tiene una ventaja real de seguridad: usted construye solo lo que necesita. Cada extensión no construida y cada modo de funcionamiento no construido es código que no puede contener una vulnerabilidad. Un build sin CGI, con pocas extensiones y rutas claras es fácil de abarcar.
A ello se opone una obligación estricta. En PHP2Shell, las distribuciones entregaron backports en parte el 21/10/2026; quien construye por sí mismo no recibe nada automáticamente. En concreto significó:
- Descargar y comprobar el código fuente de la versión corregida.
- Reconstruir con opciones idénticas;
php -imuestra la línea de configure original. - Ejecutar las pruebas e instalar.
- Reiniciar todos los procesos de PHP, como se describe en Reiniciar PHP-FPM y todos los workers.
- Comprobar la versión en ejecución, como se explica en Comprobar correctamente la versión de PHP y el estado del parche.
Un PHP compilado por uno mismo no aparece en ningún gestor de paquetes. Mantenga un inventario de en qué servidores se ejecutan builds propios y en qué versión; de lo contrario, se pasarán por alto en la próxima vulnerabilidad.
¿Cómo ayuda PHP SOS en concreto?
A través del servicio de parches de PHP apoyamos a los operadores de builds propios:
- Registrar el parque: encontramos las versiones de PHP compiladas por uno mismo y leemos sus opciones de build.
- Reconstruir: versión corregida con firma comprobada, las mismas opciones y ejecución completa de las pruebas.
- Desplegar y reiniciar: instalación, reinicio de todos los procesos y control de la versión en ejecución.
- Simplificar: donde una fuente de paquetes mantenida cumple el mismo fin, mostramos cómo pasar a ella.
Preguntas frecuentes
¿Cuándo compensa compilar PHP uno mismo?
Cuando una versión u opción necesaria no está disponible en ninguna fuente de paquetes de confianza, para el desarrollo y la depuración del propio PHP o para builds muy ligeros y especiales. Para servidores web normales, los paquetes mantenidos suelen ser la mejor opción.
¿Cómo compruebo que el código fuente de PHP es auténtico?
php.net ofrece para cada paquete de código fuente una suma de verificación SHA-256 y una firma GPG. Compare la suma de verificación y compruebe la firma con las claves de los release managers publicadas en php.net.
¿Debo volver a compilar tras una versión de seguridad?
Sí. Un PHP compilado por uno mismo no recibe actualizaciones de la distribución. Tras PHP2Shell significó: construir el código fuente de 8.5.12, 8.4.27, 8.3.36 o 8.2.35, instalarlo y reiniciar todos los procesos de PHP.
¿Dónde encuentro todas las opciones de configure?
Con ./configure --help en el directorio del código fuente. El manual menciona las opciones principales del núcleo; las opciones de las extensiones figuran en sus páginas del manual.