Compilar PHP 7 en Debian 8

Esta es la entrada 5 de 5 en la serie: Compilando PHP desde el código fuente

Introducción

Un vistazo a PHP-5.6

El pasado 3 de diciembre la comunidad PHP liberó la versión 7 de este popular lenguaje de programación considerada como una de las mayores actualizaciones en todas las historia de PHP ya que el motor (Zend Engine) fue refactorizado con el objetivo de lograr mejor rendimiento. Dentro de las nuevas características de PHP 7 podemos mencionar:

  • Rendimiento mejorado: Ahora PHP 7 es 2 veces más rápido que PHP 5.6
  • Mejor uso de la memoria: PHP 7 usa menos memoria que las versiones anteriores
  • Soporte consistente para 64 bit
  • Se mejoró la jerarquía de Exception
  • Varios errores fatales se convirtieron en Excepciones
  • Ahora se puede definir clases anónimas
  • Se agregarón 2 nuevos operadores: null coalescing (??) y spaceship (<=>)
  • Declaraciones escalares y de tipo return
  • Se eliminaron las extensiones obsoletas
  • Otras

¿Por qué compilar desde el código fuente?

Compilar desde el código es una buena opción si desea:

  • Actualizar a la última versión
  • Obtener beneficios de las últimas caractéristicas del lenguaje
  • Corregir errores de versiones anteriores
  • Personalizar el proceso de instalación

Objetivos

Después de terminar este tutorial Ud. sera capaz de compilar PHP 7 en una distribución Debian GNU/Linux

Nota: El proceso de compilación es similar para cualquier distribución.

Prerrequisitos

Este tutorial asume que Ud. tiene

  • Algún conocimiento sobre GNU/Linux
  • Debian GNU/Linux instalado
  • Esta familiarizado con el intérprete de comandos
  • Está familiarizado con el proceso de compilación

Descargar PHP

La versión de PHP disponible en el momento de escribir este tutorial es la 7.0.2, para descargarla teclee:

$ wget http://us1.php.net/distributions/php-7.0.2.tar.xz

Descompactar

Podemos descompactar el fichero descargado anteriormente usando la herramienta tar

$ tar xJvf php-7.0.2.tar.xz

donde:

x = extraer
J = permite manipular extensiones xz
v = verboso
f = fichero

Si el comando anterior emite un mensaje de error debes instalar el paquete xz-utils más información en: Error al descompactar fichero .tar.xz.

Descargar php-dev-install-dep.sh script de Github

php-dev-install-dep.sh es un bash script que facilita el proceso de instalacción de la Colección de Compiladores GNU, herramientas esenciales y dependencias necesarias.

# wget https://raw.githubusercontent.com/yoander/sysadmin/master/shscript/php-dev-install-dep.sh && \
chmod a+x -c php-dev-install-dep.sh

luego ejecute el script tecleando:

# ./php-dev-install-dep.sh

Usted puede modificar el script anterior de acuerdo a sus necesidades.

Descargar php-build.sh script de Github

php-build.sh facilita el proceso de compilación de PHP. Habilita las extensiones más comunes: curl, openssl, intl, mysql, pcre, … y permite instalar PHP en un DIR elegido por Ud. ofrece la posibilidad de compilar PHP con soporte para Apache (prefork o worker) o con soporte para PHP-FPM.

Ud. puede modificar php-build.sh de acuerdo a sus necesidades.

Si compila PHP con soporte para PHP-FPM debe editar el script php-build.sh y establecer el usuario y grupo bajo el cual correrá el servicio PHP-FPM.

# wget https://raw.githubusercontent.com/yoander/sysadmin/master/shscript/php-build.sh && \
chmod a+x -c php-build.sh

Compilar PHP con soporte para PHP-FPM y systemd

PHP-FPM (FastCGI Process Manager) es una implementación alternativa del protocolo FastCGI ques es parte oficial de PHP a partir de la versión 5.3.3.

systemd es un reemplazo al sistema de inicialización SysV. systemd además es una suite de administración de servicios y configuraciones para el sistema operativo GNU/Linux.

Primero creamos los DIR necesarios que se usaran durante el proceso de compilación.

# mkdir -p /etc/php /etc/php/conf.d /usr/lib/php/modules /usr/share/pear

Instalamos las librerías de desarrollo de systemd

# apt-get  install libsystemd-dev

luego compilamos

# ./php-build.sh -fs php-7.0.2

donde -f = soporte PHP-FPM, s = integración con systemd

Instalar

# cd php-7.0.2 && make install

Creando fichero de configuración

El código fuente de PHP viene con 2 versiones del fichero .ini. Debido a que estamos compilando PHP en un servidor de PROD tecleamos:

# cp -v php.ini-production /etc/php/php.ini

Ajuste las directivas de acuerdo a sus necesidades

Creando el fichero de configuración para PHP-FPM

# cp -pv /etc/php/php-fpm.conf.default /etc/php/php-fpm.conf

Editamos el fichero /etc/php/php-fpm.conf

Para permitir que el servicio php-fpm escuche por todas las interfaces establecemos el valor de la directiva listen a:

listen 9000

O si deseamos que escuche en una dirección IP específica

listen IP:9000

IP puede ser IPv4 o IPv6

Para restringir el acceso al servicio php-fpm y solo permitir determinadas IPs establecemos la directiva listen.allowed_clients a:

listen.allowed_clients = IP1,IP2,IP3,IP4

IP1,IP2,IP3,IP4 pueden ser IPv4 o IPv6

Habilitamos OPcache

OPcache mejora el rendimiento de sus aplicaciones al almacenar el código precompilado en la memoria compartida permitiendo servir mayor número de peticiones por segundo.

# echo "zend_extension=opcache.so" > /etc/php/conf.d/20-opcache.ini

Creamos el servicio de inicialización PHP-FPM

# cp -v ./sapi/fpm/php-fpm.service /etc/systemd/system/php-fpm.service

Si el usuario y el grupo bajo los cuales se ejecutará el servicio php-fpm no existe entonces deben crease.

# groupadd --system www-data && \ 
useradd --system -m -d /var/www  -s /usr/sbin/nologin -g www-data www-data

Los comandos anteriores crean el usuario y el grupo www-data

-m = Crea el DIR HOME si no existe
-d = DIR HOME para el usuario en cuestion
-s = login shell (no login shell debido a que el usuario www-data no se autenticará en el sistema operativo)
-g = a que grupo pertenecerá el usuario en cuestión

Si el usuario y grupo www-data existen entonces crear el DIR /var/www

# mkdir -p  /var/www/ 

Por razones de seguridad cambiaremos el propietario y el grupo para el DIR /var/www

# chown root:root -c /var/www/ && chmod 755  /var/www/ 

Creamos el fichero de configuración para el pool www

# cp -v /etc/php/php-fpm.d/www.conf.default /etc/php/php-fpm.d/www.conf

Iniciar PHP-FPM con el sistema operativo

# systemctl enable php-fpm

Iniciar el servicio PHP-FPM

# systemctl start php-fpm

Chequear el servicio PHP-FPM

# systemctl status php-fpm

Crear el fichero info.php

# echo '/var/www/info.php

NGINX

NGINX es un servidor web con excelente rendimiento y bajo consumo de memoria. NGINX puede usarse como proxy reverso y como balanceador de carga. En este ejemplo usaremos NGINX como proxy reverso para comprobar nuestro servicio PHP-FPM.

Instalando NGINX

# apt-get install nginx

Editamos /etc/nginx/nginx.conf

Buscamos la seccion server y agregamos el siguiente bloque

location ~ \.php$ {
    root /var/www; 
    fastcgi_pass 192.168.33.10:9000;
    include snippets/fastcgi-php.conf;          
}

192.168.33.10 es la IP donde el servicio php-fpm está escuchando, abrimos el fichero

/etc/nginx/snippets/fastcgi-php.conf

buscamos y comentamos la línea

try_files $fastcgi_script_name =404;

Iniciar NGINX con el sistema operativo

# systemctl enable nginx

Iniciar el servicio NGINX

# systemctl start nginx

Chequear el servicio NGINX

# systemctl status nginx

Probar

Teclee en su navegador

$ firefox http://IP/info.php

IP es la IP o la url donde el servidor NGINX está escuchando.

php 7 info

Conclusiones

Ahora que has aprendido como compilar PHP puedes obtener todas las ventajas (corrección de errores, mejoras de rendimiento, últimas funcionalidades) sin esperar a que los empaquetadores de su distribución actualicen la versión de PHP.




1 Comentario

  1. Mario Vial

    Casi nunca hago comentarios, pero te lo ganaste!
    Gracias, muchas gracias!

    Responder

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *