Depuis une bonne semaine, nous luttons sur un comportement anormal sur un serveur récemment déployé.
Nous constations sur ce serveur web un nombre anormalement élevé d’appels système open() et stat() lors de l’évaluation d’une page PHP. Si ces appels système sont parfaitement normaux, leur nombre doit être ridiculement faible lorsque des modules d’OpCode cache tels que APC ou Zend Optimizer+ sont chargés. En effet, ces modules vérifient si le fichier PHP appelé a été modifié récemment sur le système de fichiers grâce à l’appel stat(), la pile PHP n’ouvrira le fichier via l’appel open(), que si ce dernier à été modifié, en comparant les informations renvoyées par stat() avec une base de correspondance construite par le module de cache, autrement, il utilisera une version « bytecode » cachée, plus rapide car pré-compilée.

Après des heures de recherches et tentatives variées, notre équipe, accompagnée par les experts de Zend, constate la présence de l’anodin module ionCube loader, module propriétaire permettant de déchiffrer des composants PHP encodés. Aaah la magie du monde opaque.
Désactivation du chargement de ioncube_loader_lin_5.3.so et… ? Résultat instantané, plus aucun appel à open() et -50ms de temps de chargement.

Zend CloudLe client impacté ayant souscrit à l’offre Zend Cloud, le support Zend a placé la priorité de ce dysfonctionnement au plus haut, nous attendons un fix (autre que la désactivation du module) dans la journée.

En attendant, s’il fallait encore le démontrer, méfiez-vous des logiciels et autres extensions ne diffusant pas leurs sources et dont le comportement ne peut pas être analysé en profondeur.

Emile Heitor
Emile Heitor
Après avoir été CTO de NBS System, Émile conseille désormais nos clients sur leurs projets les plus complexes, notamment sur le Cloud public AWS. Expert reconnu dans le milieu informatique, toujours à la pointe des nouvelles technologies, il sait comprendre et faire comprendre les enjeux et les évolutions du marché IT.