Une petite fourberie d'un serveur web RHEL6 sur lequel je déploie des sources php via yum/RPM : le fichier inclus par des appels à include_once ou require_once n'était pas celui demandé, mais un autre. Le responsable ? APC.

Alternative PHP Cache garde en mémoire une version compilée des sources php, ce qui accélère nettement les inclusions suivantes, jusqu'à 6 fois plus vite. Mais dans sa configuration par défaut, il vérifie que le fichier n'a pas été modifié en comparant son mtime et le dernier appel.

Or rpm (comme Rsync, svn ou tar) conserve les dates originales des fichiers. Ainsi, on peut avoir un fichier version n-1, dont le dernier accès date d'un instant t, qui sera remplacé par un fichier dont le mtime est antérieur à t et qui sera ignoré par APC. Pire, si APC veut lire à nouveau le fichier, sans savoir qu'il a été remplacé, il va y accéder par son inode. C'est là qu'on se retrouve avec un autre fichier.

Pour se prémunir de celà, il faut forcer APC à utiliser ctime au lieu de mtime, en modifiant le fichier /etc/php.d/apc.ini :

; Vertification with ctime will avoid problems caused by programs such as svn or rsync by making
; sure inodes have not changed since the last stat. APC will normally only check mtime.
apc.stat_ctime=1

Puis relancer httpd (systemctl restart httpd.service ou service httpd restart