sábado, enero 04, 2014

Instalación de HHVM, hhvm-fastcgi, nginx y apache en Ubuntu 13.10

A continuación describo los procedimientos para instalar hhvm y hhvm-fastcgi en Ubuntu 13.10 por código fuente, ya que los paquetes deb adolecen de las ultimas modificaciones en las extensiones de hhvm.
Adicionalmente configuraremos apache y nginx con la extensión hhvm-fastcgi

Actualización de Ubuntu 13.10
Siempre que instalamos paquetes de desarrollo no está demás hacer un update de todos los paquetes

$> sudo su -
$> apt-get -y update
$> apt-get -y dist-upgrade

Si se actualizó  el kernel, no olviden hacer un reboot

Instalación de Prerrequisitos
$> sudo su -
$> apt-get install autoconf automake binutils-dev build-essential cmake g++ git \
  libboost-dev libboost-filesystem-dev libboost-program-options-dev libboost-regex-dev \
  libboost-system-dev libboost-thread-dev libbz2-dev libc-client-dev \
  libc-client2007e-dev libcap-dev libcurl4-openssl-dev libdwarf-dev libelf-dev \
  libexpat-dev libgd2-xpm-dev libgoogle-glog-dev libgoogle-perftools-dev libicu-dev \
  libjemalloc-dev libmcrypt-dev libmemcached-dev libmysqlclient-dev libncurses-dev \
  libonig-dev libpcre3-dev libreadline-dev libtbb-dev libtool libxml2-dev zlib1g-dev

Descargar el código fuente de hhvm, lo instalaremos en /opt
$> cd /opt
$> mkdir dev
$> cd dev
$> export CMAKE_PREFIX_PATH=`pwd`
$> git clone git://github.com/facebook/hhvm.git
$> cd hhvm
$> git submodule init
$> cd ../

Instalar librerías dependientes
libevent
$> git clone git://github.com/libevent/libevent.git
$> cd libevent
$> git checkout release-1.4.14b-stable
$> cat ../hhvm/hphp/third_party/libevent-1.4.14.fb-changes.diff | patch -p1
$> ./autogen.sh
$> ./configure --prefix=$CMAKE_PREFIX_PATH
$> make
$> make install
$> cd ..

Compilar hhvm
$> cd hhvm
$> git submodule update
$> export HPHP_HOME=`pwd`
$> cmake .
$> make

El binario hhvm se instalará en /opt/dev/hhvm/hphp/hhvm/hhvm

Instalación de nginx, mysql, apache y php (para probar los benchmark)
$> apt-get install nginx mysql-server apache2 \
apache2-data apache2-bin apache2-doc php5


HHVM Fastcgi, instalamos los precompilados para Ubuntu 13.10
$> echo deb http://dl.hhvm.com/ubuntu saucy main | tee /etc/apt/sources.list.d/hhvm.list
$> apt-get update
$> apt-get install hhvm-fastcgi

Enlazar el binario hhvm compilado a una ruta del path (reemplazar al hhvm del .deb)
$> mv /usr/bin/hhvm /usr/bin/hhvm-old
$> ln -s /opt/dev/hhvm/hphp/hhvm/hhvm /usr/bin/hhvm

Reiniciar los servicios
$> /etc/init.d/hhvm-fastcgi restart
$> /etc/init.d/apache2 restart
$> /etc/init.d/nginx restart

Editamos el index.php y lo visualizamos en el Navegador
$> vim /var/www/index.php
<?php

echo "Running on HHVM version ".HHVM_VERSION."\n";
phpinfo();
Visualizamos en Apache desde el navegador
http://localhost

Visualizamos en nginx desde el navegador
http://localhost:8090

Debemos visualizar un mensaje similar a
Running on HHVM version 2.4.0-dev HipHop 

Ejecución por consola
$> hhvm /var/www/index.php

HHVM: Hip Hop Virtual Machine for PHP, el futuro de PHP

HHVM (Hip Hop Virtual Machine for PHP) es una nueva máquina virtual para la ejecución Just In Time (JIT) de código PHP, cuya performance respecto al intérprete de PHP  ha demostrado ser hasta hasta 6 veces más rápido [1]

Hhvm fue creado por Facebook en el 2008 como HPHP (Hip Hop for PHP), un compilador escrito en C++, el cual convierte el código php en C++ y lo compila, obteniendo una performance superior al intérprete. El objetivo de Facebook con hphp. fue el de acelerar la ejecución de su plataforma web, ya que el intérprete ofrecía serios problemas de performance ante la masiva concurrencia de usuarios.

El compilador hphp evolucionó en el 2011 hasta convertirse en una máquina virtual JIT y de ahí nace hhvm. Hhvm ejecuta el código php convirtiéndolo primero a bytecode (Hip Hop Byte Code: HHBC) y almacenando este bytecote en una base de datos sqlite; la primera ejecución suele ser más lenta que las siguientes; por el proceso de conversión, pero aún así es más rápido que el intérprete estándar de php O_O.
Uno de los objetivos fundamentales de hhvm es ser 100% compatible con php 5.4/5.5 y dar soporte a las funciones eval() y create_function(), que no eran soportados por el anterior compilador.

La importancia de hhvm es que se avizora como el futuro de PHP, lo que vendría a ser un PHP6 pues el intérprete Zend no ha evolucionado como debería, presenta aún la deficiencia de rendimiento de los lenguaje interpretados y por sobre todo es difícil crear nuevas extensiones, ya que estas se tienen que escribir con lenguaje C.

Con hhvm, PHP se acerca al modelo de la JVM, ejecución JIT, soporte multithread, bytecode y lo más importante la posibilidad de crear extensiones con buena performance en el lenguaje PHP, sin necesidad de recurrir al lenguaje C.

Actualmente hhvm se desarrolla a un ritmo vertiginoso, siendo sus objetivos primordiales mejorar aún más la performance de la Virtual Machine, añadir más extensiones de Zend y ser compatible al 100% con las frameworks de PHP más populares como Symfony, drupal, doctrine2, Zend Framework2, codeigniter, slim, etc.

Adicional a esto Facebook ha publicado la extensión hhvm fastcgi para la ejecución de código PHP con los principales servidores web: Apache y nginx como un módulo fastcgi.
Con la extensión fastcgi se puede ejecutar muchas aplicaciones web desarrolladas en PHP, siendo aún los principales problemas la falta de extensiones como mysqli, gd, intl(implementado parcialmente), etc.

Recursos de hhvm
Sitio Web: http://www.hhvm.com/blog/
Github:      https://github.com/facebook/hhvm
Wiki:          https://github.com/facebook/hhvm/wiki