Comment effacer les entrées de cache APC?

je dois effacer toutes les entrées de cache APC lorsque je déploie une nouvelle version du site. L'APC.php a un bouton pour effacer toutes les caches opcode, mais je ne vois pas de boutons pour effacer toutes les entrées utilisateur, ou toutes les entrées système, ou toutes les entrées par répertoire.

est-il possible de vider toutes les entrées du cache via la ligne de commande, ou d'une autre manière?

163
demandé sur lo_fye 2009-05-26 19:00:21

18 réponses

vous pouvez utiliser la fonction PHP apc_clear_cache .

appelant apc_clear_cache() effacera le cache du système et apc_clear_cache('user') effacera le cache de l'utilisateur.

134
répondu Travis Beale 2009-05-26 15:14:02

Je ne crois pas que l'une de ces réponses fonctionne réellement pour nettoyer le cache APC de la ligne de commande. Comme Frank Farmer commenté ci-dessus, le CLI fonctionne dans un processus séparé D'Apache.

ma solution pour effacer de la ligne de commande était d'écrire un script qui copie un script de compensation APC dans le répertoire web et y accède puis le supprime. Le script est limité à l'accès depuis le localhost.

  1. apc_clear.php

    c'est le fichier que le script copie dans le répertoire web, accède, et supprime.

    <?php
    if (in_array(@$_SERVER['REMOTE_ADDR'], array('127.0.0.1', '::1')))
    {
      apc_clear_cache();
      apc_clear_cache('user');
      apc_clear_cache('opcode');
      echo json_encode(array('success' => true));
    }
    else
    {
      die('SUPER TOP SECRET');
    }
    
  2. supprimer le Cache de script

    ce script copie apc_clear.php vers le répertoire web, y accède, puis l'efface. Ceci est basé sur une tâche Symfony. Dans la version Symfony, les appels sont fait à la forme Symfony de copie et unlink, qui traitent les erreurs. Vous pouvez ajouter des contrôles qu'ils réussissent.

    copy($apcPaths['data'], $apcPaths['web']); //'data' is a non web accessable directory
    
    $url = 'http://localhost/apc_clear.php'; //use domain name as necessary
    $result = json_decode(file_get_contents($url));
    
    if (isset($result['success']) && $result['success'])
    {
      //handle success
    }
    else
    {
      //handle failure
    }
    
    unlink($apcPaths['web']);
    
113
répondu Jeremy Kauffman 2017-05-23 12:26:15

je sais que ce n'est pas pour tout le monde mais: pourquoi ne pas faire un redémarrage Apache gracieux?

pour par exemple dans le cas de Centos / RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful
65
répondu Tadas Sasnauskas 2012-05-10 09:01:07

ceci n'est pas indiqué dans la documentation, mais pour vider le cache opcode vous devez faire:

apc_clear_cache('opcode');

EDIT: Cela semble être la seule à s'appliquer à certaines versions plus anciennes de l'APC..

quelle que soit la version que vous utilisez, vous ne pouvez pas effacer mod_php ou fastcgi APC cache d'un script php cli car le script cli sera exécuté à partir d'un processus différent comme mod_php ou fastcgi. Vous devez appeler apc_clear_cache () à partir du processus (ou processus enfant) que vous je veux vider la cache. Utiliser curl pour exécuter un script php simple est l'une de ces approches.

29
répondu ColinM 2013-12-11 17:52:41

si vous voulez effacer la commande APC cache : (utilisez sudo si vous en avez besoin)

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
10
répondu Léo Benoist 2014-01-21 13:24:01

si vous utilisez une pile NGINX / PHP-FPM, votre meilleure option est probablement de simplement recharger php-fpm

service php-fpm reload (ou quelle que soit votre commande de recharge)

9
répondu passion4code 2013-04-23 19:47:09

une autre possibilité d'utilisation en ligne de commande, non encore mentionnée, est d'utiliser curl.

cela ne résout pas votre problème pour toutes les entrées de cache si vous utilisez le stock apc.PHP script, mais il pourrait appeler un script adapté ou un autre que vous avez mis en place.

ceci efface le cache opcode:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"

changez le paramètre OB en 3 pour effacer le cache de l'utilisateur:

curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=3&`date +%s`"

mettez les deux lignes dans un script et l'appeler avec $ PASSWORD dans votre env.

4
répondu Andy Triggs 2013-02-01 13:26:58

si vous voulez surveiller les résultats via json, vous pouvez utiliser ce type de script:

<?php

$result1 = apc_clear_cache();
$result2 = apc_clear_cache('user');
$result3 = apc_clear_cache('opcode');
$infos = apc_cache_info();
$infos['apc_clear_cache'] = $result1;
$infos["apc_clear_cache('user')"] = $result2;
$infos["apc_clear_cache('opcode')"] = $result3;
$infos["success"] = $result1 && $result2 && $result3;
header('Content-type: application/json');
echo json_encode($infos);

comme mentionné dans d'autres réponses, ce script devra être appelé via http ou curl et vous devrez être sécurisé s'il est exposé dans la racine web de votre application. (par ip, jeton...)

4
répondu COil 2015-10-13 10:25:29

apc_clear_cache () ne fonctionne que sur le même PHP SAPI que vous voulez que votre cache soit effacé. Si vous avez PHP-FPM et que vous voulez vider le cache apc, vous devez le faire à travers l'un des scripts php, pas la ligne de commande, car les deux caches sont séparés.

j'ai écrit CacheTool , un outil en ligne de commande qui résout exactement ce problème et avec une commande vous pouvez effacer votre cache APC PHP-FPM de la ligne de commande (il se connecte à php-fpm pour vous, et exécute les fonctions apc)

il fonctionne aussi pour opcache.

voir comment ça marche ici: http://gordalina.github.io/cachetool /

3
répondu Samuel Gordalina 2014-09-23 14:12:02

la stable D'APC a l'option de vider un cache dans son interface elle-même. Pour effacer ces entrées, vous devez vous connecter à l'interface apc.

APC a l'option de définir le nom d'utilisateur et le mot de passe dans apc.fichier php.

enter image description here

2
répondu vinothvetrivel 2013-11-14 05:26:43

si vous utilisez FPM sous ubuntu, vous devez exécuter le code ci-dessous (coché sur 12 et 14)

service php5-fpm reload
2
répondu hrnsky 2014-07-01 00:12:30

tel que défini dans le document APC:

pour effacer la course de cache:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
2
répondu codersofthedark 2015-08-06 06:17:43

apc.ini

apc.stat = " 1 " forcera APC à stat (check) le script sur chaque requête pour déterminer s'il a été modifié. S'il a été modifié, il va recompiler et mettre en cache la nouvelle version.

si ce paramètre est désactivé, APC ne vérifiera pas, ce qui signifie généralement que pour forcer APC à revérifier les fichiers, le serveur web devra être redémarré ou le cache devra être nettoyé manuellement. Notez que les configurations de serveur web FastCGI peuvent ne pas effacer le cache lors du redémarrage. Sur un serveur de production où les fichiers de script changent rarement, une augmentation significative des performances peut être obtenue par des statistiques désactivées.

1
répondu mal 2014-01-27 23:14:50

la nouvelle interface D'administration APC a des options pour ajouter/effacer le cache utilisateur et le cache opcode, une fonctionnalité intéressante est d'ajouter/rafraîchir / supprimer les répertoires à partir du Cache opCode

APC Administrateur de la Documentation

enter image description here

1
répondu Jithin Jose 2014-07-04 01:47:47

une bonne solution pour moi était simplement de ne plus utiliser le cache utilisateur obsolète après le déploiement.

si vous ajoutez un préfixe à chacune de vos clés, vous pouvez changer le préfixe en changeant la structure des données des entrées de cache. Cela vous aidera à obtenir le comportement suivant lors du déploiement:

  1. N'utilisez pas d'entrées de cache périmées après le déploiement des seules structures mises à jour
  2. ne nettoyez pas tout le cache sur deploy to not slow le bas de votre page
  3. certaines anciennes entrées en cache peuvent être réutilisées après avoir inversé votre déploiement (si les entrées n'ont pas déjà été automatiquement supprimées)
  4. APC supprimera les anciennes entrées de cache après expiration ou sur l'espace de cache manquant

cela n'est possible que pour le cache utilisateur.

0
répondu mabe.berlin 2012-12-12 15:24:27

créer APC.fichier php

foreach(array('user','opcode','') as $v ){
    apc_clear_cache($v);
}

exécutez-le depuis votre navigateur.

0
répondu anshuman 2014-04-24 11:44:31

Mon travail autour de Symfony construire ayant butin des instances sur le même serveur:

Étape 1. Créer trigger ou quelque chose pour définir un drapeau de fichier (par ex. Symfony commande) puis créer marker file ..

file_put_contents('clearAPCU','yes sir i can buggy')

Étape 2. Sur le fichier index au début ajouter le code de compensation et supprimer marker file .

if(file_exists('clearAPCU')){
    apcu_clear_cache();
    unlink('clearAPCU');
}

Étape 2. Exécuter l'application.

0
répondu Ajsti.pl - Maciej Szewczyk 2017-06-07 06:51:50

nous avons eu un problème avec APC et symlinks to symlinks to files -- il semble ignorer les changements dans les fichiers eux-mêmes. D'une certaine façon, exécuter touch sur le fichier lui-même a aidé. Je ne peux pas dire quelle est la différence entre modifier un fichier et le toucher, mais d'une certaine façon, c'était nécessaire...

-1
répondu jakub.lopuszanski 2010-06-17 06:42:30