Come cancellare le voci della cache APC?


170

Devo cancellare tutte le voci della cache APC quando distribuisco una nuova versione del sito. APC.php ha un pulsante per cancellare tutte le cache del codice operativo, ma non vedo i pulsanti per cancellare tutte le voci utente, tutte le voci di sistema o tutte le voci per directory.

È possibile cancellare tutte le voci della cache tramite la riga di comando o in qualche altro modo?


1
sarei interessato a come cancellare le voci scadute! puoi specificare un ttl, ma php.net doc dice che è espulso alla successiva richiesta quando è scaduto ...
The Surrican

Risposte:


145

È possibile utilizzare la funzione PHP apc_clear_cache.

La chiamata apc_clear_cache()cancellerà la cache di sistema e la chiamata apc_clear_cache('user')cancellerà la cache dell'utente.


20
Ho scoperto che per farlo tramite la riga di comando devi andare in apc.ini e impostare: apc.enable_cli = 1
lo_fye,

51
lo_fye: Funziona davvero? Nella mia esperienza, ho scoperto che la CLI di APC era totalmente separata dalla cache APC di apache - e giustamente, dal momento che qualsiasi processo della CLI viene eseguito in un processo completamente separato da Apache.
Frank Farmer,

9
Frank Farmer: confermo che funziona con Apache o Nginx con PHP 5.3.10 e l'interfaccia PHP-FPM. Ho creato uno script di shell che esegue questo comandophp -r "apc_clear_cache();"
ezraspectre il

13
Questo NON funziona se si esegue PHP usando mod_php. Per la ragione dichiarò Frank Farmer.
David,

11
Corro Ubuntu Server 12.04 con Nginx e PHP-FPM con PHP versione 5.4. apc_clear_cache () e apc_clear_cache ('user') dalla riga di comando NON cancellano la cache APC del server web / pagine Web !!!
Pieter Vogelaar

117

Non credo che nessuna di queste risposte funzioni effettivamente per cancellare la cache APC dalla riga di comando. Come Frank Farmer ha commentato sopra, la CLI viene eseguita in un processo separato da Apache.

La mia soluzione per la cancellazione dalla riga di comando era quella di scrivere uno script che copia uno script di cancellazione APC nella webdirectory e lo accede e quindi lo elimina. Lo script è limitato all'accesso dall'host locale.

  1. apc_clear.php

    Questo è il file che lo script copia nella directory web, accede e cancella.

    <?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. Script di cancellazione della cache

    Questo script copia apc_clear.php nella directory web, vi accede, quindi lo elimina. Questo si basa su un'attività di Symfony. Nella versione di Symfony, le chiamate vengono fatte al modulo Symfony di copia e scollegamento, che gestisce gli errori. Potresti voler aggiungere controlli che abbiano successo.

    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']);
    

8
Puoi anche semplicemente riavviare il server, ad esempio Apache se stai usando mod_php o PHP FPM se lo stai usando. La soluzione è più elegante (senza riavvio del server richiesto), ma più complesso :)
El Yobo

5
Questo è più bello del riavvio di php-fpm / apache perché non richiede che l'utente dispiegato abbia accesso sudo. Se si esegue la distribuzione su più server, digitare la password sudo per ognuno potrebbe diventare noioso.
Andrew

Personalmente non mi dispiace digitare la password sudo (il mio script di distribuzione salva la password). Ma vorrei evitare il più possibile i tempi di inattività, ecco perché sono interessato a scaricare i file APC. Per Nginx esiste un modo (non così semplice) per riavviare senza tempi di inattività. Non lo so per PGPfcgi, ma non la penso così. Il lavaggio dell'APC provoca tempi di inattività?
Julien

@andrew Puoi configurare il tuo utente per usare sudo senza digitare la tua password. Anche se cancellare APC è tutto ciò che serve, è davvero meglio, come ha detto Julien.
ChocoDeveloper

1
@Julien Immagino che potrebbe aumentare il carico del server se stai memorizzando risultati intensivi della CPU o qualcosa del genere. Non lo farei nelle ore di punta.
ChocoDeveloper

68

So che non è per tutti ma: perché non fare un grazioso riavvio di Apache?

Ad esempio nel caso di Centos / RedHat Linux:

sudo service httpd graceful

Ubuntu:

sudo service apache2 graceful

4
So che non è l'ideale, ma sono contento che tu l'abbia menzionato per una soluzione rapida e sporca.
Bryan Petty,

1
Ci scusiamo per riaprire questa discussione, ma mi trovo di fronte allo stesso problema e mi chiedo perché un cronjob non sia l'ideale per riavviare graziosamente apache2? Quali sono alcuni degli aspetti negativi di questo approccio?
user2028856

@ user2028856 Non c'è nulla di sbagliato in esso, tranne alcuni potrebbero non avere sempre il pieno controllo del server. Quindi, se funziona per te, usalo.
Tadas Sasnauskas,

@TadasSasnauskas Cosa intendi con "non avere sempre il pieno controllo del server"? Voglio dire, eseguirlo ogni mezz'ora o giù di lì causerà l'arresto anomalo di Apache o interromperà alcune altre azioni in esecuzione come un backup cron?
user2028856

@utente2028856 Volevo dire che alcuni potrebbero ospitare i loro siti su server condiviso senza possibilità di riavviare il server web. Eseguire un riavvio grazioso ogni 30 minuti dovrebbe andare bene dato che non si eseguono operatori in background tramite cli con apc abilitato (per farla breve: in alcuni casi può causare panico nel kernel)
Tadas Sasnauskas,

29

Questo non è indicato nella documentazione, ma per cancellare la cache del codice operativo è necessario:

apc_clear_cache('opcode');

EDIT: questo sembra applicarsi solo ad alcune versioni precedenti di APC ..

Indipendentemente dalla versione in uso, non è possibile cancellare la cache APC mod_php o fastcgi da uno script php cli poiché lo script cli verrà eseguito da un processo diverso come mod_php o fastcgi. È necessario chiamare apc_clear_cache () dall'interno del processo (o processo figlio) per il quale si desidera svuotare la cache. Usare curl per eseguire un semplice script php è uno di questi approcci.


1
Dovrei aggiungere, se stai eseguendo mod_php e vuoi svuotare la cache tramite php cli-mode, non puoi davvero farlo poiché i due funzionano in ambienti diversi. La mia soluzione era quella di far chiamare php in modalità cli su http usando file_get_contents. Brutto, ma funziona.
ColinM,

Eseguire il dump di una richiesta fastcgi valida direttamente a php-fpm con netcat funziona senza dover installare un vero server http, poiché il server php-fpm potrebbe essere separato da quello http
baloo,

Questa risposta è sbagliata Come è spiegato nella documentazione, la cache opcode viene sempre cancellata se il parametro dato è! = 'User'.
naitsirch,

@naitsirch Forse questo era un bug che è stato corretto nell'ultima versione .. Al momento ho pubblicato la risposta, questo è ciò che ha funzionato per me. Sfortunatamente non so quale versione stavo usando in quel momento, ma questa risposta è apparentemente utile per altre 25 persone che apparentemente stavano usando la stessa versione che ero .. La documentazione non è sempre corretta e sicuramente non è sempre corretta per le versioni precedenti.
ColinM,

12

Se vuoi cancellare la cache apc nel comando: (usa sudo se ne hai bisogno)

APCu

php -r "apcu_clear_cache();" 

APC

php -r "apc_clear_cache(); apc_clear_cache('user'); apc_clear_cache('opcode');"

Ricevo un errore sul mio terminale in questo modo per favore aiutatemi "Errore irreversibile PHP: chiamata alla funzione indefinita apc_clear_cache () nel codice della riga di comando sulla riga 1"
RaviPatidar

1
Dovresti testare che il tuo apc è installato correttamente con "php -m | grep apc"
Léo Benoist

9

Se stai eseguendo uno stack NGINX / PHP-FPM, la soluzione migliore è probabilmente quella di ricaricare php-fpm

service php-fpm reload (o qualunque sia il tuo comando di ricarica sul tuo sistema)


il servizio php5-fpm ricaricare è ciò che lo fa funzionare Ho controllato il file di stato di apc.php e lo stato della cache è stato ripristinato Ne avevo bisogno dopo aver aggiunto l'opzione apc.stat = 0 a php.ini
Salem

5

Come definito nel documento APC:

Per cancellare l'esecuzione della cache:

php -r 'function_exists("apc_clear_cache") ? apc_clear_cache() : null;'

4

Un'altra possibilità per l'utilizzo della riga di comando, non ancora menzionata, è usare l'arricciatura.

Questo non risolve il tuo problema per tutte le voci della cache se stai usando lo script stock apc.php, ma potrebbe chiamare uno script adattato o un altro che hai creato.

Questo cancella la cache del codice operativo:

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

Modificare il parametro OB su 3 per cancellare la cache dell'utente:

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

Inserisci entrambe le righe in uno script e chiamalo con $ PASSWORD nel tuo env.


4

Se vuoi monitorare i risultati tramite json, puoi usare questo tipo di 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);

Come indicato in altre risposte, questo script dovrà essere chiamato tramite http o curl e dovrai essere protetto se è esposto nella radice web della tua applicazione. (tramite ip, token ...)


3

apc_clear_cache () funziona solo sullo stesso SAPI php che si desidera svuotare la cache. Se hai PHP-FPM e vuoi svuotare la cache apc, devi farlo attraverso uno degli script php, NON dalla riga di comando, perché le due cache sono separate.

Ho scritto CacheTool , uno strumento da riga di comando che risolve esattamente questo problema e con un comando puoi cancellare la tua cache APC PHP-FPM dalla riga di comando (si collega a php-fpm per te ed esegue le funzioni apc)

Funziona anche con opcache.

Guarda come funziona qui: http://gordalina.github.io/cachetool/


2

La scuderia di APC sta avendo l'opzione per cancellare una cache nella sua stessa interfaccia. Per cancellare quelle voci devi accedere all'interfaccia apc.

APC ha l'opzione di impostare nome utente e password nel file apc.php.

inserisci qui la descrizione dell'immagine


Dove prendi questa pagina?
Pacerier,

@Pacerier Otterrai questa interfaccia se hai un php-apcpacchetto installato nel tuo sistema.
Stranger,

2

se si esegue fpm con Ubuntu, è necessario eseguire il codice seguente (controllato su 12 e 14)

service php5-fpm reload

1

apc.ini

apc.stat = "1" forza APC a stat (controllare) lo script su ogni richiesta per determinare se è stato modificato. Se è stato modificato, ricompilerà e memorizzerà nella cache la nuova versione.

Se questa impostazione è disattivata, APC non verificherà, il che di solito significa che per forzare APC a ricontrollare i file, il server Web dovrà essere riavviato o la cache dovrà essere cancellata manualmente. Si noti che le configurazioni del server Web FastCGI potrebbero non cancellare la cache al riavvio. Su un server di produzione in cui i file di script cambiano raramente, è possibile ottenere un significativo aumento delle prestazioni mediante statistiche disabilitate.


1

La nuova interfaccia di amministrazione APC ha opzioni per aggiungere / cancellare la cache dell'utente e la cache del codice operativo, Una funzionalità interessante è quella di aggiungere / aggiornare / eliminare le directory dalla cache del codice operativo

Documentazione amministratore APC

inserisci qui la descrizione dell'immagine


0

Una buona soluzione per me era semplicemente non usare più la cache utente obsoleta dopo la distribuzione.

Se si aggiunge il prefisso a ciascuna delle chiavi, è possibile modificare il prefisso cambiando la struttura dei dati delle voci della cache. Questo ti aiuterà a ottenere il seguente comportamento sulla distribuzione:

  1. Non utilizzare voci della cache obsolete dopo la distribuzione delle sole strutture aggiornate
  2. Non pulire l'intera cache durante la distribuzione per non rallentare la tua pagina
  3. Alcune vecchie voci memorizzate nella cache possono essere riutilizzate dopo il ripristino della distribuzione (se le voci non sono già state rimosse automaticamente)
  4. APC rimuoverà le vecchie voci della cache dopo la scadenza OPPURE nello spazio cache mancante

Questo è possibile solo per la cache dell'utente.


0

Crea il file APC.php

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

Eseguilo dal tuo browser.


2
A quanto ho capito, l'istanza della CLI non condividerà lo stesso segmento di memoria cache APC, quindi questo non farà altro che cancellare un segmento di cache APC vuoto e isolato.
AB Carroll,

a seconda delle distribuzioni e delle configurazioni, la cache APC può avere un segmento di memoria separato, l'ho aggiornato per una soluzione più generica.
anshuman

0

Il mio work-around per la build di Symfony ha un sacco di istanze sullo stesso server:

Passaggio 1. Creare un trigger o qualcosa per impostare un flag di file (ad es. Comando Symfony) quindi creare marker file..

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

Passaggio 2. Al file indice all'avvio aggiungere il codice di cancellazione e rimuovere marker file.

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

Passaggio 2. Eseguire l'app.


-1

Abbiamo avuto un problema con APC e collegamenti simbolici ai collegamenti simbolici ai file - sembra ignorare le modifiche ai file stessi. In qualche modo è stato utile eseguire un tocco sul file stesso. Non posso dire quale sia la differenza tra la modifica di un file e toccarlo, ma in qualche modo era necessario ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.