Je dois effacer toutes les entrées de cache APC lorsque je déploie une nouvelle version du site . APC.php a un bouton pour effacer tous les caches d'opcode, mais je ne vois pas les boutons pour effacer toutes les entrées d'utilisateur ou toutes les entrées système , ou toutes les entrées par répertoire.
Est-il possible d'effacer toutes les entrées du cache via la ligne de commande ou d'une autre manière?
Vous pouvez utiliser la fonction PHP apc_clear_cache
.
L'appel de apc_clear_cache()
effacera le cache système et l'appel de apc_clear_cache('user')
effacera le cache utilisateur.
Je ne crois pas qu'aucune de ces réponses fonctionne réellement pour vider le cache APC de la ligne de commande. Comme Frank Farmer commenté ci-dessus, la CLI s'exécute dans un processus distinct d'Apache.
Ma solution pour effacer de la ligne de commande consistait à écrire un script qui copie un script de suppression APC dans le répertoire web
et y accède, puis le supprime. Le script est limité à un accès depuis l'hôte local.
apc_clear.php
Il s'agit du 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');
}
Script de nettoyage de cache
Ce script copie apc_clear.php dans le répertoire Web, y accède, puis le supprime. Ceci est basé sur une tâche Symfony. Dans la version Symfony, les appels sont effectués sous la forme de copie et de suppression de liaison de Symfony, qui gèrent les erreurs. Vous voudrez peut-être ajouter des contrôles pour vérifier leur succès.
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']);
Je sais que ce n'est pas pour tout le monde mais pourquoi ne pas faire un redémarrage Apache gracieux?
Par exemple dans le cas de Centos/Red Hat Linux:
Sudo service httpd graceful
Ubuntu:
Sudo service Apache2 graceful
Ce n'est pas indiqué dans la documentation, mais pour effacer le cache d'opcode, vous devez faire:
apc_clear_cache('opcode');
EDIT: Cela semble s’appliquer uniquement à certaines anciennes versions d’APC.
Quelle que soit la version que vous utilisez, vous ne pouvez pas effacer le cache APC mod_php ou fastcgi d'un script clp php car le script cli sera exécuté à partir d'un processus différent, tel que mod_php ou fastcgi. Vous devez appeler apc_clear_cache () à partir du processus (ou du processus enfant) pour lequel vous souhaitez effacer le cache. Utiliser curl pour exécuter un script php simple est une telle approche.
Si vous voulez vider le cache apc dans la commande: (utilisez Sudo si vous en avez besoin)
php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"
Si vous utilisez une pile NGINX/PHP-FPM, le mieux est probablement de recharger simplement php-fpm
service php-fpm reload
(ou quelle que soit votre commande de rechargement sur votre système)
Une autre possibilité d'utilisation de la ligne de commande, pas encore mentionnée, consiste à utiliser curl.
Cela ne résout pas votre problème pour toutes les entrées de cache si vous utilisez le script stock apc.php, mais cela pourrait appeler un script adapté ou un autre que vous avez mis en place.
Cela efface le cache d'opcode:
curl --user apc:$PASSWORD "http://www.example.com/apc.php?CC=1&OB=1&`date +%s`"
Définissez le paramètre OB sur 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 appelez-le avec $ PASSWORD dans votre env.
Tel que défini dans le document APC:
Pour effacer le cache, exécutez:
php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'
Si vous souhaitez 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é à la racine Web de votre application. (par ip, jeton ...)
apc_clear_cache () ne fonctionne que sur le même SAPI php que celui que vous voulez vider. Si vous avez PHP-FPM et que vous voulez effacer le cache d'apc, vous devez le faire via l'un des scripts php, PAS la ligne de commande, car les deux caches sont séparés.
J'ai écrit CacheTool , un outil de ligne de commande qui résout exactement ce problème et en une seule commande, vous pouvez effacer votre cache PHP-FPM APC de la ligne de commande (il se connecte à php-fpm pour vous et exécute des fonctions apc)
Cela fonctionne aussi pour opcache.
Voyez comment cela fonctionne ici: http://gordalina.github.io/cachetool/
si vous exécutez fpm sous ubuntu, vous devez exécuter le code ci-dessous (vérifié les 12 et 14)
service php5-fpm reload
L'écurie d'APC a l'option de vider un cache dans son interface même. Pour effacer ces entrées, vous devez vous connecter à apc interface.
APC a l'option de définir le nom d'utilisateur et le mot de passe dans le fichier apc.php.
apc.ini
apc.stat = "1" obligera APC à stat (vérifier) le script à chaque demande pour déterminer s'il a été modifié. S'il a été modifié, il recompilera et mettra 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 obliger APC à revérifier les fichiers, le serveur Web devra être redémarré ou le cache devra être vidé manuellement. Notez que les configurations de serveur Web FastCGI peuvent ne pas effacer le cache au redémarrage. Sur un serveur de production où les fichiers de script changent rarement, les statistiques désactivées peuvent améliorer considérablement les performances.
La nouvelle interface d'administration APC offre des options pour ajouter/effacer le cache utilisateur et le cache opcode. Une fonctionnalité intéressante consiste à ajouter/actualiser/supprimer des répertoires du cache opCode
Mon solution pour la construction de Symfony ayant le butin d’instances sur le même serveur:
Étape 1. Créez un déclencheur ou quelque chose pour définir un indicateur de fichier (par exemple, une commande Symfony), puis créez marker file
..
file_put_contents('clearAPCU','yes sir i can buggy')
Étape 2. Au début du fichier index, ajoutez le code de compensation et supprimez marker file
.
if(file_exists('clearAPCU')){
apcu_clear_cache();
unlink('clearAPCU');
}
Étape 2. Exécutez l'application.
Créer un fichier APC.php
foreach(array('user','opcode','') as $v ){
apc_clear_cache($v);
}
Lancez-le depuis votre navigateur.
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 modifier le préfixe lors de la modification de la structure de données des entrées de cache. Cela vous aidera à obtenir le comportement suivant lors du déploiement:
Ceci est possible pour le cache utilisateur uniquement.