Tutoriales
PHP Manual

Primeros pasos con HHVM

En esta sección aprenderá cómo configurar NGINX con HHVM y MongoDB. Sin embargo, este tutorial no pretende ser una guia exclusiva de cómo ejecutar NGINX y HHVM en un entorno de producción.

En este tutorial emplearemos un sistema Debian con NGINX instalado a través de apt-get y HHVM instalado desde el código fuente o desde paquetes preconstruidos a /usr/local/hhvm/3.9.1 (con los binarios ubicados en /usr/local/hhvm/3.9.1/bin/hhvm).

Instalación de NGINX

Simplemente instalamos NGINX ejecutando apt-get install nginx-full. Si NGINX no se iniciase después de su instalación, probablemente sea porque ya se tenga otro servidor web (p.ej. Apache) ejecutándose en el mismo puerto. En este daso, se podrán ver las siguientes líneas en /var/log/nginx/error.log:

2015/09/29 10:19:27 [emerg] 22445#22445: bind() to 0.0.0.0:80 failed (98:Address already in use)
2015/09/29 10:19:27 [emerg] 22445#22445: bind() to [::]:80 failed (98: Address already in use)

Para solucionar este problema, se puede o bien cambiar el puerto predeterminado para NGINX o Apache, o bien detener el proceso de Apache con service apache2 stop, o bien eliminar Apache por completo con apt-get remove apache2.

Instalación de HHVM

Este tutorial está escrito desde la perspectiva de un desarrollador de extensiones, por lo que hemos instalado HHVM desde el código fuente para facilitar el desarrollo de parches y asegurar la disponibilidad de los símbolos de depuración. Dicho esto, los de Facebook también proporcionan paquetes preconstruidos, que es lo que probablemente usted utilice en producción y desarrollo. Se pueden encontrar las instrucciones de instalación de esto paquetes en la » Wiki de HHVM.

Será necesario instalar los paquetes hhvm y hhvm-dev. Este último es necesario para poder compilar la extensión MongoDB HHVM después.

Si está compilando HHVM desde el código fuente, será necesario crear /var/run/hhvm:

sudo mkdir -p /var/run/hhvm
sudo chown www-data.www-data /var/run/hhvm
sudo mkdir /etc/hhvm
sudo touch /etc/hhvm/php.ini
# Así no tendrá que hacer ``sudo`` para editar el fichero
sudo chown derick /etc/hhvm/php.ini
# Para ver si realmente funciona
echo "date.timezone=Europe/London" >> /etc/hhvm/php.ini

HHVM debería iniciarse como el usuario www-data. Para los propósitos de este tutorial, lo podremos ejecutar en segundo plano en el modo server como sigue:

sudo -u www-data -s /usr/local/hhvm/3.9.1/bin/hhvm \
 --mode server \
 -vServer.Type=fastcgi \
 -vServer.FileSocket=/var/run/hhvm/sock

Comunicación entre NGINX y HHVM

Una vez se esté ejecutando HHVM, necesitamos indicar a NGINX cómo comunicarse con HHVM para ejecutar ficheros .php. Aunque esta no sea la estrategia más limpia, se puede añadir el siguiente código a /etc/nginx/sites-enabled/default, justo depués de la sección location / { … }:

location ~ \.php$ {
   fastcgi_pass unix:/var/run/hhvm/sock;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   include fastcgi_params;
}

Después de añadir este código se debe reiniciar NGINX:

sudo service nginx restart

Para confirmar que todo funciona bien, crearemos un directorio de proyecto con un fichero index.php que llame a phpinfo():

Ahora, en el navegador, solicite la página http://gargleblaster/mi-primer-proyecto/index.php (ajustando el nombre del host). Se debería mostrar una página comenzando con "HHVM Version 3.9.1" seguido de varias tablas con información.

Instalación del Controlador de MongoDB para HHVM

El controlador de MongoDB es la parte que conecta el PHP de HHVM con el servidor de bases de datos. Para instalar y registrar el controlador con HHVM, es necesario seguir los pasos de Instalación manual de Controlador de MongoDB para HHVM.

Después de haber instalado y habilitado la extensión, HHVM necesitará reiniciarse. Si se tenía HHVM ejecutándose en el «shell» anteriormente, detnéngalo con Ctrl-C y reinicielo de nuevo como antes:

sudo -u www-data -s /usr/local/hhvm/3.9.1/bin/hhvm \
   --mode server \
   -vServer.Type=fastcgi \
   -vServer.FileSocket=/var/run/hhvm/sock

Para porbar que el controlador está cargado, edite el fichero index.php y reemplace su contenido con:

<?php
var_dump
(phpversion("mongodb"));
?>

Esto debería mostrar algo similar a:

string(5) "x.y.z"

Otras lecturas

Continúe este tutorial en Empleo de la biblioteca de PHP para MongoDB (PHPLIB)


Tutoriales
PHP Manual