HHVM est un interpréteur pour le langage PHP créé par Facebook. Il gère actuellement un sous ensemble confortable de PHP5 et le langage de programmation Hack dérivé de PHP. Les différences de fonctionnement entre Hack et PHP sont documentées sur le site officiel. De même, la plupart des modules PHP sont fonctionnels avec HHVM.
Installation :
Le projet HHVM a le bon goût de proposer des paquets Debian et Ubuntu, par conséquent :
sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0x5a16e7281be7a449 sudo add-apt-repository "deb http://dl.hhvm.com/ubuntu $(lsb_release -sc) main" sudo apt-get update sudo apt-get install hhvm
Pour tester, c’est très simple, on peut utiliser le démon HHVM.
Créons une simple page PHP affichant bêtement un Hello World :
Puis démarrons le serveur web dans le même répertoire que le fichier PHP précédent:
hhvm -m server -p 9000
Et vérifions que ça marche en initiant une simple connexion avec un butineur :
curl -v "http://localhost:9000" * Rebuilt URL to: http://localhost:9000/ * Hostname was NOT found in DNS cache * Trying ::1... * Connected to localhost (::1) port 9080 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.35.0 > Host: localhost:9000 > Accept: */* > < HTTP/1.1 200 OK < Vary: Accept-Encoding < Content-Type: text/html < X-Powered-By: HHVM/3.11.0 < Date: Mon, 11 Jan 2016 21:11:18 GMT < Connection: keep-alive < Content-Length: 13 < Hello World! * Connection #0 to host localhost left intact
Le port est aussi celui par défaut du serveur, configurable dans le fichier /etc/hhvm/server.ini.
Et en production ?
Sur un serveur de production, c'est toujours HHVM qui fonctionne en démon. La communication avec le serveur HTTP se fait via FastCGI. Ainsi, HHVM est compatible Nginx ou Apache.
Commençons par installer un Apache basé sur les threads, tant qu'à miser sur les performances autant rester dans la continuité et plaçons notre bout de code dans le répertoire par défaut d'Apache :
apt-get -y install apache-mpm-worker mv index.php /var/www/html
Le packaging est plutôt bien peaufiné car un script de configuration /usr/share/hhvm/install_fastcgi.sh sait s'occuper de la configuration d'Apache comme de Nginx :
root@web:/home/julien# /usr/share/hhvm/install_fastcgi.sh Checking if Apache is installed Detected Apache installation Looking for custom proxy configuration No custom proxy configuration found Checking for enabled proxy_fcgi.load Not found Checking for enabled fastcgi.load Not found Checking for enabled fcgid.load Not found Checking for available proxy_fcgi.load Found, checking for loading directives Detected available proxy_fcgi.load configuration, setting up integration Checking for available hhvm_proxy_fcgi.conf Found, checking for loading directives Detected available hhvm_proxy_fcgi.conf configuration, setting up integration Checking for available proxy.load Found, checking for loading directives Detected available proxy.load configuration, setting up integration Checking for available proxy.conf Found, checking for loading directives Detected available proxy.conf configuration, setting up integration Enabling module proxy.load Found available module Creating a symlink Finished creating a symlink Enabling module proxy.conf Found available module Creating a symlink Finished creating a symlink Enabling module proxy_fcgi.load Found available module Creating a symlink Finished creating a symlink Force enabling module hhvm_proxy_fcgi.conf Available module found Removed possible duplicates Enabling module hhvm_proxy_fcgi.conf Found available module Creating a symlink Finished creating a symlink Completed force enabling Restarting apache Apache is running, restarting * Restarting web server apache2 AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message [ OK ] Finished restarting Finished restarting apache Checking if Nginx is installed Nginx not found
Et activer le démarrage au boot du serveur HHVM :
update-rc.d -f hhvm defaults Adding system startup for /etc/init.d/hhvm ... /etc/rc0.d/K20hhvm -> ../init.d/hhvm /etc/rc1.d/K20hhvm -> ../init.d/hhvm /etc/rc6.d/K20hhvm -> ../init.d/hhvm /etc/rc2.d/S20hhvm -> ../init.d/hhvm /etc/rc3.d/S20hhvm -> ../init.d/hhvm /etc/rc4.d/S20hhvm -> ../init.d/hhvm /etc/rc5.d/S20hhvm -> ../init.d/hhvm
Il reste enfin une correction à effectuer dans le fichier /etc/apache2/mods-available/hhvm_proxy_fcgi.conf. En effet, le répertoire indiqué ne correspond pas à la directive DocumentRoot d'Apache. Sans cette correction, le fichier /var/log/hhvm/error.log va vous gratifier de jolis messages "\nNotice: File could not be loaded: //var/www/index.php" et le navigateur d'une erreur RequestInitDocument Not Found
ProxyPassMatch ^/(.+\.(hh|php)(/.*)?)$ fcgi://127.0.0.1:9000/var/www/html/$1
Important, pour chaque VirtualHost, il faudra redéfinir une directive ProxyPassMatch correspondant au DocumentRoot associé.