<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// Ce document utilise PHP Emballage des extraits de code,Pour la mise en forme de démonstration uniquement</span></span><span>
</span><span><span class="hljs-comment">// Le contenu réel est le texte principal de l'article,Code non géré。</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
---
</span><span><span class="hljs-comment"># Pourquoi opcache_compile_file Les fonctions ne mettra pas à jour le cache immédiatement?Causes et solutions courantes</span></span><span>
Utilisé PHP de **Opcache** Lors de l'expansion,Les développeurs rencontrent souvent un problème:Appel `</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>()` Après la fonction,预期de脚本更新并没有立即生效。autrement dit,Le cache semble“Têtu”L'ancienne version est conservée。Cela affectera non seulement l'expérience de débogage,Cela peut également entraîner l'échec des mises à jour chaudes en ligne。sous,我们来分析其中de常见原因,并提供相应de解决方案。
</span><span><span class="hljs-comment">## un、opcache_compile_file de作用机制</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>(</span><span><span class="hljs-variable">$file</span></span><span>)` de主要功能是将指定de PHP Fichier compilé en bytecode,Coexister Opcache En cache。Il ne force pas la suppression du cache existant,Au lieu de cela, il a tendance à se compiler uniquement lorsque le cache n'existe pas.。C'est-à-dire,si该文件decache已存在,Appel该函数可能不会触发更新。
</span><span><span class="hljs-comment">## deux、不会立即更新cachede常见原因</span></span><span>
</span><span><span class="hljs-number">1</span></span><span>. **Il y a un cache qui n'a pas expiré**
- Opcache Les fichiers seront mis en cache par défaut,Jusqu'à ce que le temps d'expiration soit atteint ou que le fichier soit détecté pour être modifié。
- si `validate_timestamps=</span><span><span class="hljs-number">0</span></span><span>`,Alors même si le contenu du fichier a été mis à jour,Opcache Ne détectera pas activement,导致cacheun直使用旧版本。
</span><span><span class="hljs-number">2</span></span><span>. **opcache_compile_file Ne pas écraser les caches existantes**
- 此函数de设计初衷是“Préchauffer”cache,Au lieu de remplacer le contenu existant。
- un旦文件已cache,后续Appel `</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>()` Il ne sera pas recompilé de force。
</span><span><span class="hljs-number">3</span></span><span>. **Le temps de modification des fichiers n'a pas changé**
- quand `validate_timestamps=</span><span><span class="hljs-number">1</span></span><span>` et `revalidate_freq > </span><span><span class="hljs-number">0</span></span><span>` heure,Opcache 会根据文件de修改heure间 (mtime) Pour déterminer si la recompilation est requise。
- si文件de mtime Pas de mise à jour(例如直接覆盖文件内容但未改变heure间戳),则不会触发cache刷新。
</span><span><span class="hljs-number">4</span></span><span>. **opcache.restrict_api limite**
- Dans certains environnements de serveur,`</span><span><span class="hljs-title function_ invoke__">opcache_compile_file</span></span><span>()` deAppel可能被limite,导致函数Appel并没有生效。
</span><span><span class="hljs-number">5</span></span><span>. **多进程环境de延迟**
- PHP-FPM ou Apache En mode multi-processus,不同进程间de Opcache Il peut y avoir un retard de synchronisation dans l'État。
- Dans certains cas,即使某个进程已更新cache,D'autres processus peuvent encore utiliser des versions plus anciennes。
</span><span><span class="hljs-comment">## trois、Solutions et suggestions</span></span><span>
</span><span><span class="hljs-number">1</span></span><span>. **启用heure间戳验证**
```ini
opcache.validate_timestamps=</span><span><span class="hljs-number">1</span></span><span>
opcache.revalidate_freq=</span><span><span class="hljs-number">0</span></span><span>
</span></span>Cela garantit que le cache sera actualisé immédiatement une fois le fichier modifié.
Cache nettoyant manuellement <br> Après la mise à jour du code, les fonctions suivantes peuvent être appelées:
<span><span><span class="hljs-title function_ invoke__">opcache_invalidate</span></span><span>(</span><span><span class="hljs-string">'/path/to/file.php'</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span></span>La définition du deuxième paramètre sur True signifie forcer la compensation du cache pour assurer la recompilation la prochaine fois.
Utiliser en combinaison avec OPCACHE_COMPILE_FILE <br> Une pratique courante consiste d'abord à appeler opcache_invalidate () pour effacer l'ancien cache, puis appeler OPCACHE_COMPILE_FILE () pour réchauffer le nouveau cache.
Faites attention à l'horodatage des fichiers <br> Assurez-vous que Mtime change (par exemple via la commande tactile ) lors de la mise à jour du fichier afin qu'Opcache détecte correctement les modifications.
État du processus unifié <br> Dans un environnement multi-processus, le rafraîchissement du cache et l'échauffement peuvent être effectués uniformément à l'aide de la logique de la couche d'application (comme le système de publication) pour empêcher certains processus de lire l'ancien cache.
OPCACHE_COMPILE_FILE () n'est pas une fonction "Refresh Cache", mais un outil "compiler et ajouter du cache". Si le fichier a été mis en cache, il ne remplacera pas activement le contenu existant.
Pour s'assurer que la mise à jour du code peut prendre effet immédiatement, il est recommandé d'utiliser OPCACHE_INVALIDAD () pour effacer l'ancien cache, puis le préchauffer avec OPCACHE_COMPILE_FILE () . Cela peut non seulement éviter l'ancien cache résiduel, mais également assurer des performances élevées après son lancement.
Ce n'est qu'en comprenant le mécanisme de fonctionnement de l'OPCACH et en utilisant des fonctions que nous pouvons vraiment donner vraiment un jeu complet à ses avantages dans l'optimisation des performances et le déploiement du code.
<span></span>