2014-05-10 3 views
1

Pour l'invalidation du cache d'opcode (php 5.5), j'ai écrit un petit script. Cependant, le statut me dit que l'invalidation a échoué. Comment cela peut-il arriver?L'invalidation d'opcache ne met pas à jour le statut d'opcache

<?php 
$scripts = opcache_get_status(true)["scripts"];  
$failures = array(); 
foreach (array_keys($scripts) as $file) { 
    $result = opcache_invalidate($file, true); 
    if (!$result) $failures[] = $file; 
} 
if(count($failures) !== 0) { 
    exit("Failed to clear OPcache for files " . implode(", ", $failures)); 
} 

echo sprintf("%s OPcache files cleared\n", count($scripts)); 

$scripts = opcache_get_status(true)["scripts"]; 
echo sprintf("There are still %s files in the cache", count($scripts)); 

Il est maintenant un script très simple (qui fera partie de Soflomo\Cache). Mon problème est que le premier écho ("x fichiers OPcache effacés pour le web") affiche le même nombre que le dernier echo ("Il y a encore des fichiers x dans le cache")!

Comment reproduire:

  1. Installer une grande application FW (en utilisant ZF2 ici)
  2. place au-dessus fichier dans le Webroot de l'application
  3. exécuter l'application (500+ fichiers se cache)
  4. Exécutez le script, la sortie sera similaire à:

560 fichiers OPcache de CLEA rouge

Il y a encore 560 fichiers dans le cache

Quelqu'un peut-il expliquer cela? Et les fichiers sont-ils effacés à coup sûr, ou pas?

PS. Je sais que ce qui précède pourrait être remplacé par opcache_reset(), mais le script filtrera sur un certain sous-ensemble de fichiers à l'étape suivante. Il est destiné à effacer l'opcode pour les fichiers d'une seule application, même si plusieurs applications s'exécutent sur un seul serveur. La réinitialisation effacera tous ces fichiers, ce qui n'est pas une option.

Répondre

3

Opcache n'extracte pas les éléments non valides de la mémoire - ils restent là jusqu'à ce que le pool soit plein, à quel point la mémoire est complètement effacée. L'existence d'une entrée de cache invalide n'empêche pas PHP de charger/compiler le fichier à nouveau.

+0

Merci pour la réponse rapide. Est-ce que "ils restent là jusqu'à ce que le pool soit plein, à quel point la mémoire est complètement effacée" signifie que les anciens éléments restent en mémoire, ne font rien et quand ce processus atteint finalement la limite de mémoire, il vide la mémoire complète tous les articles "valides" sont-ils partis? En d'autres termes; Peut-être que ce n'est pas une bonne idée de vider le cache pour un sous-ensemble du cache (c'est-à-dire une seule application sur le serveur)? –

+1

Oui, c'est exactement ce que cela signifie. Pour la majorité des sites Web, avec ram étant relativement bon marché, ce n'est pas un problème tant que vous ne déployez pas très souvent ou avez l'infrastructure pour basculer les serveurs dans/hors/pressé le cache. Si ce n'est pas le cas pour tout le monde, alors il vaut mieux retourner à apc – symcbean

+0

Vous vous demandez maintenant, si j'invalide le fichier foo.php, puis recharger foo.php pour qu'il soit à nouveau mis en cache, est-il placé en mémoire le l'endroit où foo.php était auparavant, ou faut-il un autre "slot" dans l'opcache? Et aussi, y a-t-il d'autres informations de fond sur ce sujet où je pourrais trouver les travailleurs (j'espère que sans lire le code source qui sera assez difficile je suppose). –