Compilando PHP 7 en CentOS 7

Que quede una cosa clara desde el principio! Yo no soy un fan de compilar software! Encuentro que hoy en día, compilar ya es cosa del pasado,
a menos que quieras probar software que todavía no está listo para funcionar en producción. Como tal, quise probar qué tal andaba PHP7 con el
código de la empresa, a raíz de las tantas maravillas que se ha dejado entrever de esta nueva versión.

Algunas de estas maravillas son que incluyeron PHPNG (PHP Next Generation), que mejora el uso de recursos (su aplicación ocupará MUCHO menos RAM), y ahora también se activó un JIT Engine (que aceleraría las llamadas recurrentes a funciones y métodos). Entre esas dos mejoras, deberían ver un incremento de velocidad del orden de 25% a 150% comparado con PHP 5.6, dependiendo del caso obviamente.

Esto quiere decir básicamente que en una instalación default de WordPress, la cantidad de instrucciones de CPU se redujeron de 9.413.106.833 a 2.483.106.468 y que el tiempo que ocupa generar 1000 veces el homepage se redujo de 26.756 segundos a 11.081 segundos (Como pueden verificar acá). En ambos casos, es un incremento de velocidad importante y está casi a la par (y actualmente en muchos casos aún más rápido) que HHVM de Facebook.

Lo primero que necesitamos para empezar a trabajar es una instalación limpia y minimalista de CentOS 7. No es necesario desactivar SELinux ya que todo funciona con SELinux activado. Lo primero que hay que hacer es activar ethernet (Predeterminadamente viene desactivado, esto se hace en /etc/sysconfig/network-scripts/ifcfg-enp0s3, cambiando la opción ONBOOT=no por ONBOOT=yes al final de este archivo), y una vez hecho eso, necesitaremos algunos paquetes para empezar:

yum install deltarpm # Ayudará a bajarle el tamaño de los paquetes que tengamos que bajar
yum update # Siempre mantener el sistema lo más actualizado posible
reboot
## Después del reinicio ##
yum install git autoconf gcc bison epel-release

En principio, no necesitaremos nada más para una instalación básica de PHP. Sin embargo, como también quiero un PHP que sea medianamente usable, necesitaremos de algunas dependencias.

Las dependencias

Todos los comandos se deben ejecutar como root.
Estas son las dependencias para esta instalación de PHP7:

yum install gcc-c++ mariadb-devel aspell-devel recode-devel readline-devel \
 libxml2-devel openssl-devel bzip2-devel curl-devel libjpeg-devel libpng-devel \
 libXpm-devel freetype-devel gmp-devel libicu-devel libmcrypt-devel

Una cosa curiosa es que libmcrypt ya no está en el repositorio central de CentOS 7, así que por eso instalé epel para poder instalar este paquete.

Ahora tenemos que instalar PHP mismo, así que simplemente bajamos la última versión y compilamos desde ahí:

git clone https://git.php.net/repository/php-src.git
cd php-src/

Compilando PHP

El comando definitivo para compilar PHP7:

./buildconf
./configure \
 --prefix=/usr \
 --with-config-file-path=/etc \
 --enable-mbstring \
 --enable-zip \
 --enable-bcmath \
 --enable-pcntl \
 --enable-ftp \
 --enable-exif \
 --enable-calendar \
 --enable-sysvmsg \
 --enable-sysvsem \
 --enable-sysvshm \
 --enable-wddx \
 --with-curl \
 --with-mcrypt \
 --with-iconv \
 --with-gmp \
 --with-pspell \
 --with-gd \
 --with-jpeg-dir=/usr \
 --with-png-dir=/usr \
 --with-zlib-dir=/usr \
 --with-xpm-dir=/usr \
 --with-freetype-dir=/usr \
 --enable-gd-native-ttf \
 --enable-gd-jis-conv \
 --with-openssl \
 --with-pdo-mysql=/usr \
 --with-gettext=/usr \
 --with-zlib=/usr \
 --with-bz2=/usr \
 --with-recode=/usr \
 --with-mysqli=/usr/bin/mysql_config \
 --enable-maintainer-zts \
 --enable-intl \
 --enable-opcache \
 --enable-opcache-file \
 --enable-fpm \
 --with-readline

Sé que cuando compilan, les gusta saber qué compilan, así que aquí un pequeño listado de las opciones más desconocidas y/o emblemáticas/nuevas:

  • enable-bcmath: La librería de matemáticas extendida de PHP. Más información.
  • enable-pcntl / sysvmsg / sysvsem / sysvshm: Process Control y asociados. Fundamental para procesos CLI. Más información.
  • enable-calendar: Las funciones de calendario. Más información.
  • with-gmp: GNU Multiple Precision: Otra librería de matemáticas, suelo ocupar algunas funciones de repente. Más información.
  • with-pspell: Librería de ortografía! Más información.
  • enable-maintainer-zts: Para soporte de pthreads (en el futuro). Más información.
  • enable-intl: i18n, fundamental para el mundo globalizado de hoy!
  • enable-opcache-file: Opción nueva y experimental, aceleraría procesos CLI. Sin link de más información ya que es una opción nueva con PHP 7 y no hay documentación todavía. Sé de esta opción por la lista de correos.
  • enable-fpm: Para crear un módulo fast-cgi en vez de php_module (que es viejo y lento). Más información. Prometo que haré una guía que integra PHP con nginx y fast_cgi más adelante.
  • with-readline: Para phpdbg (Debugger de PHP interactivo). Más información.

Una vez compilado, podemos proceder a crear el build y la instalación propiamente tal, a tomar café!

make
make install

Al finalizar, tendremos un binario que se habrá copiado a alguna ruta donde hayan binarios (/usr/bin/ en este caso), y que si lo ejecutamos nos dará la siguiente salida:

[[email protected] ~]# php -v
PHP 7.0.0-dev (cli) (built: Jun 15 2015 14:34:33) 
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0-dev, Copyright (c) 1998-2015 Zend Technologies

Si desean experimentar con el setting --enable-opcache-file, deberán crear un nuevo /etc/php.ini, y en ella incluir las siguientes opciones:

[opcache]
opcache.enable = 1
opcache.enable_cli = 1
opcache.file_cache = /tmp
opcache.file_cache_only = 1

Esto debería hacer opcache persistente, ideal para varias sesiones de CLI.

Verificaciones

Ahora nos toca verificar que todo haya ido bien y que todo funciona.

Primero aprovechamos de instalar composer, tal como es descrito en este post. (Capa9 entero preparado!)

Enseguida copiamos un repositorio y ejecutamos algunas pruebas:

git clone https://github.com/unreal4u/fileOperations.git
cd fileOperations/
composer.phar install
vendor/bin/phpunit

En mi PC de desarrollo normal, donde tengo PHP 5.5.20, el test con 3 runs me da la siguiente salida:

Time: 3.28 seconds, Memory: 8.00Mb
Time: 1.35 seconds, Memory: 8.00Mb
Time: 1.36 seconds, Memory: 8.00Mb

Esta es la salida de 3 runs con PHP 7:

Time: 183 ms, Memory: 4.00Mb
Time: 196 ms, Memory: 4.00Mb
Time: 232 ms, Memory: 4.00Mb

Como podemos ver, en la primera test PHP 7 es 16 veces más rápido que PHP 5.5, mientras que en la segunda y tercera es aproximadamente 6 veces más rápido. La memoria? Pues ocupa un 50% menos de memoria.

Conclusiones

PHP 7 es rápido y esta prueba lo comprueba. Lamentablemente tendremos que esperar hasta noviembre para la salida definitiva de PHP 7 al mundo, pero desde ya se puede comprobar que los esfuerzos realizados por el equipo que desarrolla PHP rindieron su fruto. Además del incremento en velocidad en aplicaciones viejas, queda por ver qué tanto más rápido será ocupar el JIT Engine, cuando tenga un tiempo y ahora que tengo una versión ocupable de PHP 7 haré las optimizaciones correspondientes y postearé las pruebas.

Fuentes

SupportLobby
CryBit
coderwall

Comentarios