Admin/Dev

09
Mars
2018

Migration PHP 5.4 vers 5.6 : Résoudre les problèmes de cache sur les fichiers

Publié par sky

En migrant plusieurs sites depuis un serveur disposant de PHP 5.4 vers 5.6, je me suis retrouvé avec de nombreux plugins ne fonctionnant plus. Tous ces plugins avaient en commun l'utilisation de fichiers pour gérer des valeurs dans un cache local, avec une succession de "write" et "require" très rapprochée dans le temps.

Nota bene, ici le besoin de performance était quasi nul, et l'utilisation d'une base de données plus complèxe à mettre en oeuvre, même si, au final, le problème ne serait jamais arrivé.

Avec la migration, les valeurs du cache n'étaient plus aussi stables, et il arrivait souvent que certaines actions ne soit pas prises en compte, en particulier l'initialisation de ce dernier.

Le problème venait tout simplement de l'introduction de OPcache, une fonctionnalité qui permet à PHP de stocker le bytecode pré-compilé en mémoire afin d'augmenter de beaucoup les performances à l'exécution.

En bref, PHP faisait du cache par dessus notre solution de cache, ce qui résultait par un joli bazar.

 

Comment corriger le problème ?

Avec l'introduction de OPCache, ce sont de nouvelles fonctions permettant de le contrôler qui ont aussi été ajoutées. Lorsque c'est nécessaire, il faut indiquer à PHP que l'on souhaite supprimer le cache du fichier que l'on vient d'écrire. Ainsi, c'est toujours la dernière version qui sera prise en compte.

Lorsque j'écris un fichier

file_put_contents($file, $content, LOCK_EX);

J'ajoute juste derrière

opcache_invalidate($path);

ou si je souhaite une fonction qui reste compatible avec PHP 5.4

if (function_exists('opcache_invalidate')) opcache_invalidate($file);

Attention de ne pas abuser de la fonction, car l'on perdrait évidemment tous les bénéfices d'OPCache.

Simple ! Même si le problème, en lui même, m'aura fait chercher un petit moment.

 
 
Commentaires
Aucun commentaire pour le moment.

 

Poster un commentaire
En postant sur skymac.org, je m'engage à être courtois et à ce que mon message soit pertinent avec le sujet de l'article.
En outre, j'accepte, sans condition, que mon message soit refusé et supprimé si ces règles ne sont pas appliquées.
Captcha indisponible
Pour valider le formulaire, vous devez confirmer que vous êtes bien une personne. Actuellement, la fonctionnalité est indisponible. Vous devez activer le service ReCaptcha dans le gestionnaire des cookies, et donc consentir à l'utilisation de ses cookies.
Ouvrir le panneau de gestion des cookies
Fermer le panneau
Ce site utilise des cookies pour assurer son bon fonctionnement. Il utilise aussi des cookies issues de services tiers permettant de proposer des fonctionnalités avancées. À tout moment, vous pouvez choisir quels services vous souhaitez activer ou refuser, afin de retirer votre consentement quant à l'utilisation des cookies.
 
Personnalisation des services
Vous êtes libre de choisir quels services vous souhaitez activer. En autorisant ces services tiers, vous acceptez le dépôt et la lecture de cookies et l'utilisation de technologies de suivi nécessaires à leur bon fonctionnement. En retirant votre consentement pour certains de ces services, certaines fonctionnalités du site peuvent ne plus fonctionner.
Navigation du site  En savoir plus
Le site écrit un cookie de session permettant son bon fonctionnement et aidant à la navigation. Il ne peut être désactivé.
Utilisation : 1 cookie, enregistre l'identifiant de la session.
Durée de vie : Le cookie est présent pendant toute la session sur le site. Il devient obsolète après 24 minutes d'inactivité.
Obligatoire
Popup Média
Afficher des vidéos depuis Yoube ou Dailymotion.
ReCaptcha  En savoir plus
Permet de valider que les visiteurs sont bien des humains lorsqu'ils valident des formulaires.
 
Tout accepter Tout refuser Gérer