hhvm logo

HHVM, l’autre interpréteur PHP!

Posted by

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é.

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *