Base de connaissances:
Déploiement de site sous php 5.6+ et soucis de caching
Publié par ghislain AQUEOS sur 19 December 2017 10:24 AM
Bonjour,


  Comme vous le savez sûrement le php dispose de nouveaux mécanisme de cache avec les versions récentes, certains comme l'opcache ne fonctionnent plus comme apc en se basant sur l'inode du fichier mais sur son chemin.

  Si vous utilisez un outils de déploiement qui change les fichiers par le moyen de liens symboliques vous risquez de voir votre ancienne version alors meme que le site a été modifié car le php garde en cache les informations.
  Voici un petit script vous permettant lors du déploiement de vider le cache de chemin et l'opcache:

#!/bin/bash
# $1 = nom de domaine en normal ou IDNA (pas utf8 ou accent)
# $2 = docroot
# appel:  resetcache.sh "mondomaine.com" "/var/ici//la/public_html/current"
# ne pas oublier les guillemets pour eviter les soucis en cas d'espace typo et autre
# on met le fichier dans le docroot pour ne pas complexifier la creation de l'url
if [[ "$1" == "-h" ]]; then
        echo 'arg1 => domaine en ascii, arg2 => chemin ou est cree le fichier (docroot)';
fi

# filtrage du domaine
#DOMAINE=${1//[^a-zA-Z0-9_\.\-]/}};  a-z inclus les accents donc....
DOMAINE=${1//[^[:digit:]abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_\.\-]/};

# si docroot existe et est un repertoire et que $2 n'est pas vide
if [[ -d "${2}/" && -n $2 ]]; then
        # on genere un fichier vide dans le docroot de façon propre et "secure"
        RANDOM_NAME=$(mktemp -q --tmpdir="${2}" --suffix=".php" resetXXXXXXXXXXXXXXXXXX );
        # si fichier temporaire existe et est vide
        if [[ -e "${RANDOM_NAME}" && ! -s "${RANDOM_NAME}" ]]; then
                echo "<?php opcache_reset();clearstatcache (true); ?>" > "${RANDOM_NAME}";
                # on prend le nom du fichier sans le chemin
                CHEMINHTTP=$(basename "${RANDOM_NAME}");
                # curl sur ip externe et non pas localhost car haproxy n'ecoute pas sur localhost
                # on utilise le header pour pouvoir flush meme si le domaine ne pointe pas encore
                curl -s -H "Host: ${DOMAINE}" "http://$(hostname -f)/${CHEMINHTTP}" > /dev/null;
                rm "${RANDOM_NAME}";
        else
                echo "echec de mktemp"
        fi
else
        echo "manque le chemin ou chemin invalide";
fi


  En espérant que cela vous aidera. N'hésitez pas a nous contacter si vous y apportez des améliorations.

Cordialement,
AQUOES.
(0 vote(s))
Utile
Pas utile

Commentaires (0)