Configurazione di APC. Caching in PHP.
!!! Attenzione !!! Non utilizzare APC se hai PHP versione 5.5 o superiore: OPCache sostituisce APC ed è integrato in PHP.
Il 21 marzo 2013 è stata rilasciata la versione beta 1 di PHP 5.5, che include “Zend OPCache” — sembra chiaramente che questo sarà il sostituto di APC in futuro, poiché è incluso nel core di PHP e dovrà essere mantenuto per ogni nuova release.
APC (Alternative PHP Cache) è un sistema di caching per PHP che memorizza il codice operativo (opcode) in cache. Come descrivono gli sviluppatori stessi: “APC è un sistema gratuito, open-source e affidabile per la memorizzazione e l’ottimizzazione del codice intermedio PHP”.
PHP è un linguaggio di alto livello. Come in tutti i linguaggi di alto livello, può essere compilato e utilizzato su diverse piattaforme. I CMS come Drupal sono composti da centinaia, se non migliaia, di script PHP, e la loro natura modulare implica che durante il caricamento di una pagina possano essere eseguiti centinaia di questi script. A differenza di altri linguaggi di alto livello, PHP viene interpretato al volo: cioè, lo script viene convertito in bytecode durante l’esecuzione. Qui entra in gioco APC: APC può salvare una copia compilata dello script in memoria e pronta all’uso, riducendo notevolmente le risorse necessarie per l’esecuzione di Drupal. (Va notato che in alcuni linguaggi questo avviene automaticamente — ad esempio, in Python lo script viene tradotto e memorizzato come file compilato, che il server utilizza successivamente senza ricompilazione).
Configurare APC è molto semplice. Prima è necessario installarlo:
sudo apt-get install php-pear
sudo apt-get install php5-dev apache2-prefork-dev build-essential
sudo pecl install apc
Ora è necessario copiare il file apc.php (fornito con questa lezione) sul server, quindi riavviare Apache:
sudo /etc/init.d/apache2 restart
Puoi ora aprire il file http://test/apc.php e visualizzare le statistiche di APC.
Vedrai una schermata di statistiche simile a questa. Come puoi notare dai grafici, la situazione non è ottimale: un gran numero di file mancanti nella cache (MISS) e pochi file trovati (HITS). Anche la frammentazione della memoria APC è alta. Tutto ciò indica un uso inefficiente di APC. Le cause principali sono:
Mancanza di memoria: se hai assegnato 8 MB ad APC ma gli script caricati occupano 12 MB, i file non entreranno completamente in cache e compariranno molti MISS.
Frammentazione: può capitare che tu abbia 32 MB disponibili ma i file richiedano 40 MB. Alcuni moduli possono essere caricati raramente ma comunque occupare spazio in cache. In certi casi i file grandi vengono suddivisi in più parti per essere inseriti in memoria, creando spazi vuoti (frammenti inutilizzati).
Vediamo ora i principali parametri di configurazione di APC. Il file di configurazione si trova in /etc/php5/conf.d/apc.ini:
apc.enabled=1
APC è abilitato. Un’impostazione ovvia ma fondamentale: disabilitare APC ridurrebbe le prestazioni del server.
apc.shm_segments=1
apc.shm_size=32
Queste impostazioni definiscono quanta memoria dedicare ad APC. apc.shm_segments=1
indica un solo segmento di memoria, mentre apc.shm_size=32
specifica che il segmento è di 32 MB. Puoi aumentarlo a 64 MB e riavviare Apache. Se il numero di MISS rimane alto (oltre l’1%), aumenta gradualmente a 128 MB, e così via. Questo è il parametro principale da ottimizzare.
apc.cache_by_default=1
;apc.filters=
Con queste impostazioni, APC funziona per tutti gli script PHP. Puoi commentare la riga apc.filters
se non vuoi filtrare nulla.
apc.cache_by_default=0
apc.filters="+drupal6"
In questo modo limiterai APC solo ai file di Drupal 6 — utile per evitare che la cache venga svuotata quando usi PhpMyAdmin.
apc.stat=1
Questo parametro influisce direttamente sulle prestazioni. Quando è attivo, APC aggiorna automaticamente la cache ogni volta che un file PHP viene modificato. Se è disattivato, i file restano in cache finché non vengono eliminati manualmente. È consigliato abilitare questa opzione in produzione e disabilitarla in ambiente di sviluppo. Inoltre, quando apc.stat è attivo, ricorda di svuotare la cache dopo l’aggiornamento di moduli o del core di Drupal.
apc.ttl=0
Determina dopo quanto tempo (in secondi) svuotare la cache. Con 0, la cache non viene mai pulita (valore predefinito: 7200, cioè 2 ore). Meglio impostarlo su 0 per evitare di perdere dati utili.
apc.rfc1867=1
Attiva la possibilità di monitorare lo stato del caricamento file tramite APC — utile se vuoi visualizzare la progress bar in Drupal.
apc.num_files_hint=2048
Imposta il numero massimo di file che possono essere memorizzati. Se sul server hai più siti (più installazioni di Drupal), aumenta questo valore per evitare che la cache di un sito sovrascriva quella di un altro (default: 1024).
Dopo aver modificato le impostazioni, ricordati di riavviare Apache. I grafici ottimali dovrebbero apparire così:
Nota: il numero di MISS deve essere prossimo a zero e la frammentazione pari a 0%.