2009-05-26 21 views
161

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 opcode, ma non vedo i pulsanti per cancellare tutte le voci utente, o tutte le voci di sistema, o tutte le voci per directory.Come cancellare le voci della cache APC?

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

+1

Sarei interessato a come cancellare le voci scadute! puoi specificare un ttl, ma il documento php.net dice che è cancellato alla prossima richiesta quando è scaduto ... –

risposta

131

È possibile utilizzare la funzione PHP apc_clear_cache.

Chiamare apc_clear_cache() cancellerà la cache di sistema e chiamando apc_clear_cache('user') cancellerà la cache dell'utente.

+17

Ho scoperto che per farlo via linea di comando devi andare in apc.ini e impostare: apc. enable_cli = 1 –

+50

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

+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 comando 'php -r" apc_clear_cache(); "' – ezraspectre

29

Questo non è indicato nella documentazione, ma per cancellare la cache codice operativo che si deve fare:

apc_clear_cache('opcode'); 

EDIT: Questo sembra applicarsi solo in alcune versioni precedenti di APC ..

Non importa quale versione stai usando non puoi 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() all'interno del processo (o processo figlio) per il quale si desidera cancellare la cache. Usare l'arricciatura per eseguire un semplice script php è un approccio del genere.

+1

Dovrei aggiungere, se stai usando mod_php e vuoi cancellare la cache tramite php in modalità cli, non puoi farlo perché i due sono in esecuzione in ambienti diversi. La mia soluzione era quella di avere la php in modalità cli chiamarsi su http usando file_get_contents. Brutto, ma funziona. – ColinM

+0

funziona per me – dynamic

+0

Pipeing un dump di una richiesta fastcgi valida direttamente su php-fpm con netcat funziona senza dover installare un vero server http, dal momento che il server php-fpm potrebbe essere separato da quello http – baloo

-1

Abbiamo riscontrato un problema con APC e collegamenti simbolici ai collegamenti simbolici ai file: sembra ignorare le modifiche nei file stessi. In qualche modo, l'esecuzione del tocco sul file stesso ha aiutato. Non riesco a capire quale sia la differenza tra modificare un file e toccarlo, ma in qualche modo era necessario ...

111

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

La mia soluzione per la cancellazione dalla riga di comando era scrivere uno script che copia uno script di cancellazione APC nella directory web 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, accessi ed eliminazioni.

    <?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 svuotare la cache

    Questo script copia apc_clear.php alla directory web, vi accede, poi lo cancella. Questo è basato 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 dei controlli che riescono.

    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 riavviare il server, ad es. Apache se stai usando mod_php o PHP FPM se lo stai usando. La tua soluzione è più elegante (non è richiesto il riavvio del server) ma è più complessa :) –

+5

Questo è più bello del riavvio di php-fpm/apache perché non richiede che l'utente di deploy abbia accesso sudo. Se si sta distribuendo su più server, digitare la password sudo per ognuno potrebbe diventare faticoso. – andrew

+0

Personalmente non mi interessa 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 c'è un modo (non così facile) di riavviare senza tempi di fermo. Non lo so per PGPfcgi, ma non penso. Lo svuotamento APC causa tempi di inattività? – Julien

64

io so che non è per tutti, ma: perché non fare un riavvio graziosa Apache?

Ad es.in caso di CentOS/RedHat Linux:

sudo service httpd graceful 

Ubuntu:

sudo service apache2 graceful 
+4

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

+1

Ci scusiamo per riaprire questa discussione ma mi trovo di fronte allo stesso problema e mi chiedo perché non è un cronjob che rende ideale il riavvio di Apache2? Quali sono alcuni aspetti negativi di questo approccio? – user2028856

+0

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

0

Crea APC.php il file

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

eseguirlo dal tuo browser.

+2

Per quanto ho capito, l'istanza CLI non condividerà lo stesso segmento di memoria cache APC, quindi non farà altro che cancellare un segmento di cache APC vuoto e isolato. –

+0

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

0

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

Se si aggiunge il prefisso a ciascuna chiave, è possibile modificare il prefisso sulla modifica della struttura dati delle voci della cache. Questo vi aiuterà a ottenere il seguente comportamento su Deploy:

  1. Non utilizzare le voci di cache obsolete dopo implementazione di strutture solo aggiornati
  2. Non pulire l'intera cache su Deploy per non rallentare il page
  3. Alcune vecchie voci memorizzate nella cache possono essere riutilizzati dopo aver ripristinato la vostra distribuzione (Se le voci non è stato rimosso automaticamente già)
  4. APC rimuove vecchie voci di cache dopo scadono O sulla mancanza di spazio di cache

Questo è possibile solo per la cache utente.

4

Un'altra possibilità per l'utilizzo da riga di comando, non ancora menzionato, è l'uso di arricciatura.

Questo non risolve il problema per tutte le voci della cache se si utilizza lo script apc.php di riserva, ma potrebbe chiamare uno script adattato o un altro che è stato creato.

questo cancella la cache codice operativo:

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

Modificare il parametro OB a 3 per cancellare la cache utente:

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

Mettere entrambe le linee in uno script e lo chiamano con $ password nel tuo ENV.

9

Se si esegue su uno stack/PHP-FPM Nginx, la soluzione migliore è quella di probabilmente solo ricaricare php-fpm

service php-fpm reload (o qualunque sia il vostro comando reload può essere sul vostro sistema)

+0

service php5-fpm reload è ciò che lo fa funzionare Ho controllato il file di stato di apc.php e lo stato della cache è stato ripristinato Mi è stato necessario questo dopo aggiungere l'opzione apc.stat = 0 a php.ini –

2

Il stable of APC sta avendo l'opzione per cancellare una cache nella sua interfaccia stessa. Per cancellare queste voci è necessario accedere all'interfaccia di apc.

APC ha un'opzione per impostare nome utente e password nel file apc.php.

enter image description here

+0

Dove prendi questa pagina? – Pacerier

+0

@Pacerier Otterrete questa interfaccia se avete installato il pacchetto 'php-apc' nel vostro sistema. – Stranger

10

Se si desidera cancellare la cache di APC al comando: (uso sudo se ne avete bisogno)

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

Ho ricevuto errori sul mio terminale in quel modo, per favore aiutatemi "PHP Errore fatale: chiamata alla funzione non definita apc_clear_cache() nel codice di riga di comando sulla riga 1" – RaviPatidar

+1

Si dovrebbe verificare che l'apc sia installato correttamente con "php -m | grep apc " –

+0

O per APCU: php -r" apcu_clear_cache(); " – BigJ

1

apc.ini

apc.stat = "1" imporrà APC a stat (verificare) lo script su ciascuna richiesta per determinare se è stato modificato. Se è stato modificato, ricompila e memorizza nella cache la nuova versione.

Se questa impostazione è disattivata, APC non verifica, il che significa in genere che per forzare l'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 con le statistiche disabilitate.

2

se si esegue FPM sotto Ubuntu, è necessario eseguire il codice qui sotto (controllato il 12 e 14)

interfaccia
service php5-fpm reload 
1

nuovo APC Admin hanno opzioni per aggiungere cache utente chiara/e la cache codice operativo, One funzionalità interessante è quello di aggiungere/aggiornamento/cancellare la directory di codice operativo da cache

APC Admin Documentation

enter image description here

3

apc_cl ear_cache() funziona solo con lo stesso php SAPI che vuoi cancellare dalla cache. Se hai PHP-FPM e vuoi cancellare la cache di apc, devi farlo attraverso uno degli script php, NON dalla riga di comando, perché le due cache sono separate.

ho scritto CacheTool, uno strumento a riga di comando che risolve proprio questo problema e con un solo comando è possibile cancellare la cache PHP-FPM APC da linea di comando (si connette a php-FPM per voi, ed esegue funzioni di APC)

Funziona anche per opcache.

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

2

Come definito nel documento di APC:

Per cancellare l'esecuzione della cache:

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

Se si desidera monitorare i risultati attraverso JSON, è possibile utilizzare 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 menzionato in altri a nswers, questo script dovrà essere chiamato tramite http o curl e dovrai essere protetto se è esposto nella web root della tua applicazione. (Da IP, Token ...)

0

My work-around per Symfony costruire avere bottino di istanze allo stesso server:

Fase 1. Creare trigger o qualcosa per impostare un flag di file (ad esempio, . comando di Symfony) quindi creare marker file ..

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

Fase 2. Il file di indice all'avvio aggiungere compensazione codice e rimuovere marker file.

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

Fase 2. Run app.

Problemi correlati