L'arrivée de la machine HipHop par Facebook (HHVM) a réveillé le projet PHP et a instauré une saine compétition entre les différents projets. Ainsi, vous allez constater que la performance est maintenant un objectif important au point que les temps d'exécution ont été divisés par trois entre la version de PHP 5.3.10 et la version PHP 5.6.4.
Cependant, l'effet négatif de cette compétition est l'apparition de tests biasés ou peu réalistes. En effet, beaucoup de tests comparent les performances des différents runtime avec le calcul de la suite de Fibronaci, de l'encodage json ou avec la lecture d'un article de WordPress (base quasiment vide et sans plugin). Cela peut intéresser certains projets, mais la plupart des gens veulent plutôt savoir ce que valent les différentes alternatives avec une application réelle et composite. On constate alors qu'il faut nuancer les vitesses d'exécution annoncées dans le cas des toutes dernières versions.
Nous avons créé un script JMeter que vous pouvez trouver sur le dépôt du projet. Afin d'exclure une partie des temps réseau, les composants statiques (JS, CSS, images, etc.) ne sont pas téléchargés, car nous nous intéressons seulement au temps de calcul des différents moteurs PHP. De même, le test d'effectuera pas d'écriture en base de données.
La base a été chargée avec 2000 utilisateurs et 7000 demandes de congé (voir le fichier Excel dans le répertoire donné en lien).
Nous avons utilisé un VPS hébergé par OVH avec un VCPU et 1 Go de RAM. Nous avons limité le test à 30 utilisateurs simultanés et des pauses de moins de 10 secondes entre les étapes. Ces limites ont été calculées de manière à rester en dessous de 60% de temps CPU, autrement dit le serveur n'a jamais été en situation de saturation. Les machines PHP sont lancées avec leur configuration par défaut en tant que serveur FastCGI.
Le test dure environ 30 minutes et les temps de réponse comparés sont ceux du 90ème centile. Dit simplement, on compare ce qui se passe dans 90% des cas en excluant les échantillons les plus extrêmes.
Vous pouvez vous reporter à la conclusion de l'article pour plus d'informations techniques.
On constate une amélioration significative des performances à partir de la version 5.4 de PHP. D'une part, les temps de réponse des versions antérieures sont médiocres et, d'autre part, les dernières versions consomment moins de puissance CPU pour un résultat plus rapide.
Nous préconisons l'installation de Jorani avec la version 5.6 de PHP. Nous vous encourageons vivement à mettre à jour votre environnement dans le cas d'une version antérieure.
La version 7 est encore en cours de développement et ses performances pourraient être améliorées d'ici sa sortie (prévue en fin d'année 2015). Cependant, il ne faut pas s'attendre à une compression importante des temps de réponse.
Transaction | PHP 5.3.10 | PHP 5.4.41 | PHP 5.5.25 | PHP 5.6.4 | PHP 7-dev | HHVM |
---|---|---|---|---|---|---|
-331% | -105% | -47% | base | -5% | -31% | |
Login Form | 3188 | 2431 | 2369 | 2117 | 2102 | 2919 |
Login Action | 3179 | 1254 | 908 | 376 | 383 | 344 |
Home | 893 | 406 | 204 | 136 | 155 | 175 |
List of leaves | 1399 | 714 | 506 | 298 | 326 | 402 |
Export leaves | 2652 | 998 | 492 | 173 | 286 | 188 |
View counters | 1393 | 623 | 238 | 144 | 173 | 192 |
View calendar | 1252 | 624 | 313 | 201 | 228 | 300 |
Leaves feed for FullCalendar | 1146 | 471 | 182 | 110 | 146 | 133 |
Show day offs in calendar | 1037 | 389 | 188 | 118 | 140 | 152 |
tabular calendar | 2292 | 1104 | 647 | 415 | 434 | 476 |
Show organization | 1376 | 635 | 371 | 230 | 251 | 323 |
Root node of organization | 1629 | 508 | 199 | 142 | 138 | 166 |
List of employees in a node | 1256 | 397 | 180 | 110 | 133 | 138 |
Supervisor of a node | 977 | 359 | 172 | 106 | 135 | 134 |
Request List | 2166 | 1440 | 1417 | 1027 | 986 | 1429 |
View a leave | 1198 | 588 | 215 | 144 | 177 | 200 |
ICS of day offs | 2417 | 756 | 625 | 290 | 293 | 317 |
ICS of global calendar | 1945 | 749 | 604 | 399 | 376 | 371 |
Logout | 1600 | 734 | 396 | 245 | 298 | 317 |
API get access token | 701 | 395 | 203 | 139 | 175 | 154 |
API get list of employees | 2014 | 1371 | 1715 | 1365 | 1385 | 1985 |
Comme expliqué précédemment, les benchmarks existant concernent rarement une application complète et composée de plusieurs dépendances externes au projet. Si cela peut vous aider dans votre propre projet, nous listons ici les différentes bibliothèques tierces utilisées par les différentes transactions.
Transaction | BCRYPT | phpseclib | PHPExcel | Oauth2 | VObject | (json) |
---|---|---|---|---|---|---|
Login Action | ||||||
Export leaves | ||||||
Root node of organization | ||||||
List of employees in a node | ||||||
ICS of day offs | ||||||
ICS of global calendar | ||||||
API get access token | ||||||
API get list of employees |
Attention au fait que le test de performance employé dans cet article n'est pas représentatif des conditions réelles d'utilisation de Jorani. Le script met l'application en situation de stress et sollicite des fonctionnalités pas forcément utilisées dans votre organisation (l'API par exemple) et à des fréquences d'appel élevées. Il s'agit d'un benchmark — ou test technique de comparaison.
Cependant, vous pourriez vous inspirer du script JMeter mis à disposition afin de créer votre propre test de charge. Tester la performance de l'application est important — entre autres objectifs — pour valider le dimensionnement de votre hébergement.
Cela n'a pas d'importance dans l'interprétation des résultats, mais le serveur utilisé était nginx et le serveur de données était mariadb touts deux dans leur dernière version et sur le même serveur (l'overhead de ces deux composants était de l'ordre de 5%).
HHVM a été lancé en mode serveur.
hhvm --mode server -vServer.Type=fastcgi -vServer.Port=9000
PHP a été lancé en mode serveur avec 4 workers pour les versions 5.3 à 5.6, tandis que la version 7 a nécessité 8 workers (sans quoi elle plantait).
PHP_FCGI_CHILDREN=4 export PHP_FCGI_CHILDREN /usr/bin/php-cgi -b 127.0.0.1:9000
Il est possible d'optimiser les différents paramètres et l'environnement d'exécution (par exemple en utilisant une socket), mais il est difficile de trouver de la documentation. En particulier pour HHVM où le tuning des environnements n'est pas très bien expliqué par le projet. Pour PHP, la situation est différente, car la lacune de documentation vient des changements importants survenus dans les dernières versions. En effet, beaucoup de documents et articles ont été rendu obsolètes par les dernières versions.
N'hésitez pas à contribuer en partageant vos astuces d'optimisation.
— Benjamin BALET
Avant d’accepter une demande de congé soumise par un employé, un manager peut visualiser l’état individuel des congés d’un employé. Lire »
Un responsable RH doit pouvoir vérifier rapidement sa saisie et vérifier l'état des congés d'un employé en quelques clics. Lire »
Jorani permet aux managers de connaître la liste des personnes susceptibles de leur soumettre des demandes d’absence ainsi que leur solde de congé. Lire »
Cet article explique comment activer le code de suivi de Google Analytics et éventuellement tracer l'ID des utilisateurs. Lire »
Cette page permet de gérer les ressources humaines. On peut vérifier et régulariser les congés de certains employés. Lire »