Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

Ottimizzare PHP con Alternative PHP Cache (APC)

Presentazione e uso dell'estensione Alternative PHP Cache (APC) che, attraverso un codice intermedio, ottimizza e gestisce la cache delle applicazioni PHP
Presentazione e uso dell'estensione Alternative PHP Cache (APC) che, attraverso un codice intermedio, ottimizza e gestisce la cache delle applicazioni PHP
Link copiato negli appunti

PHP è uno dei linguaggi di scripting per il web più diffuso; nonostante nasca da un progetto amatoriale di uno sviluppatore PERL, l'engine che risiede dietro il motore di compilazione ed esecuzione è stato modificato e migliorato in continuazione negli ultimi anni, sia per aggiungere nuove funzionalità per gli sviluppatori di estensioni, sia per rendere l'intero progetto molto più stabile e performante. Nonostante l'esecuzione di codice PHP non sia eccessivamente lenta, spesso si sente la necessità di poter sfruttare metodi che permettano di diminuire l'utilizzo di risorse sul server e facciano aumentare il numero di richieste gestite; parte di questi obiettivi possono essere raggiunti implementando operazioni di caching dell'output e di alcune richieste, ma spesso non basta.

In PHP, ogni volta che una pagina contenente del codice di scripting viene richiamata, questa viene analizzata e precompilata in codice intermedio, che successivamente viene leggermente ottimizzato ed eseguito. Come è possibile dedurre, il processo di compilazione ed ottimizzazione viene effettuato sempre, indipendentemente dal fatto che la pagina sia stata modificata o meno. Questo comporta una serie di rallentamenti che potrebbero essere evitati salvando in memoria il risultato dell'ottimizzazione come fanno alcuni altri linguaggi per lo sviluppo web (vedasi JSP per esempio).

APC (Alternative PHP Cache) è un'estensione nativa per PHP che svolge principalmente il compito di precompilare, ottimizzare e mantenere in memoria il codice intermedio associato agli script PHP in modo che venga bypassato questo passaggio dopo la prima richiesta effettuata ad un file PHP.

Installare e configurare la libreria

Probabilmente quando uscirà PHP 6 questi includerà nativamente il supporto ad APC, alla quale verranno fatte alcune migliorie ed ottimizzazioni al fine di adattarsi alle modifiche che verranno apportate allo Zend Engine. Aspettando quel tempo, possiamo comunque installare ed utilizzare APC poiché essa èuna libreria nativa compatibile sia con PHP 4 sia con PHP 5.

Il processo di installazione è il solito che si usa seguire quando è necessario aggiungere nuove librerie native per PHP. Nel caso di utenti Windows è possibile scaricare la DLL precompilata della libreria (che potete trovare direttamente sul sito di PHP), posizionarla all'interno della directory contenente le altre estensioni ed infine abilitarla da file php.ini utilizzando la direttiva

extension=php_apc.dll

Nel caso invece ci si trovi su Linux o su un altro ambiente Unix like, è possibile compilare manualmente la libreria attraverso il comando phpize. Per prima cosa recuperiamo i sorgenti dal sito di PECL e decomprimiamoli all'interno di una cartella del filesystem. Successivamente accediamo alla cartella ed eseguiamo le seguenti istruzioni (è possibile che alcune richiedano i permessi di root - oltretutto la directory in cui posizionare il modulo può dipendere dalle opzioni di compilazione e configurazione eseguire durante l'installazione di PHP):

phpize
./configure --enable-apc --enable-mmap
make
cp modules/apc.so /usr/local/lib/php

Indipendentemente dal sistema operativo che stiamo utilizzando è necessario riavviare il Web server affinché la libreria risulti disponibile per l'utilizzo.

Direttive di php.ini

Dopo l'installazione possiamo procedere con la configurazione impostando alcune direttive all'interno del file php.ini. Nonostante le opzioni abbiano valori di default, consiglio sempre di impostarli manualmente (soprattutto se si sta operando su un server di produzione) in modo da poter adattare il comportamento della libreria alle nostre esigenze ed essere in grado di comprendere i valori di configurazione nel caso in cui dovesse capitare di doverli modificare successivamente. La maggior parte di queste opzioni di configurazione (a parte apc.enabled ed apc.optimization) possono essere impostate solamente nel file php.ini.

Vediamo le opzioni più importanti ed il loro utilizzo (le altre opzioni possono essere apprese dalla documentazione ufficiale della libreria sul sito ufficiale di PHP):

  • apc.enabled: si occupa di stabilire se la libreria APC è abilitata o disabilitata, e può essere impostato anche a livello di directory attraverso la configurazione del Web server. Un valore pari a zero indica che la libreria è disabilitata.
  • apc.optimization: è una variabile di configurazione ancora sperimentale, che specifica con un valore numerico il livello di ottimizzazione da applicare al bytecode intermedio generato dallo Zend Engine. Più alto è il valore più alto sarà il grado di ottimizzazione, anche se in generale l'engine genera codice ben ottimizzato.
  • apc.ttl: indica il numero di secondi nei quali del codice intermedio salvato proveniente da un file verrà lasciato all'interno dello slot di memoria ad esso assegnato anche nel caso in cui questo slot venga richiesto dalla libreria. Se si lascia questo valore a zero, è possibile che rimangano in memoria cache relative agli stessi file, per lungo tempo, senza che venga mai lasciato spazio per i nuovi bytecode generati.
  • apc.filters: una lista separata da virgole di espressioni regolari che verranno utilizzate per istruire APC su quali file salvare in cache e quali no. Spesso è conveniente, per risparmiare spazio in memoria, salvare solamente i file cui si accede di più e poco modificati, lasciando quelli meno richiesti alla ricompilazione. Il path su cui verranno eseguire le espressioni regolari è quello specificato per l'inclusione, non il path assoluto. Ogni espressione regolare può essere preceduta da un più (+) per indicare che i file corrispondenti dovranno essere compilati, ed un meno (-) per indicare il contrario. Il valore di default è il meno.
  • apc.file_update_protection: alcuni comandi utilizzati per sostituire i file sul server non eseguono operazioni atomiche (non caricano in un file temporaneo e poi sostituiscono quello precedente). Questo può creare alcuni problemi ad APC, che potrebbe trovarsi ad accedere a file incompleti. Per evitare questo problema questa direttiva specifica il delay in secondi dopo i quali si potrà procedere con l'operazione di compilazione. Il numero standard è 2, che dovrebbe andar bene quasi sempre, salvo casi in cui ci si trovi ad aver a che fare con sorgenti molto lunghi o macchine particolarmente lente.

Come utilizzare APC

Nonostante molte operazioni della libreria APC vengano svolte in modo trasparente durante l'esecuzione dello Zend Engine è possibile interrogare APC ed utilizzare alcune caratteristiche interessanti esposte dalla libreria.

Spesso può risultare utile, soprattutto in fase di debugging o quando avvengono errori ed eccezioni inaspettate, conoscere lo stato della cache di APC per poter comprendere se questa ha influito sul malfunzionamento. Per ottenere un array associativo contenente i metadati relativi allo stato attuale della cache utilizziamo la funzione apc_cache_info.

La cache viene ripulita automaticamente da APC in base alle direttive specificate in fase di compilazione utilizzando delle funzioni avanzate di garbage collection che permettono anche il riciclo della cache marcata per l'eliminazione. Nel caso fosse necessario è possibile comunque ripulire la cache manualmente utilizzando la funzione apc_clear_cache.

Non so se è una cosa nota a tutti, ma definire costanti attraverso la funzione define di PHP è un'operazione molto lenta. Sebbene sia buona norma non abusare di questa funzione, fortunatamente possiamo sfruttare APC per definire costanti in modo molto veloce: la funzione apc_define_constants accetta come primo parametro una stringa per identificare con un nome univoco un gruppo di costanti, come secondo parametro un array chiave/valore che rappresenta le costanti da definire ed opzionalmente un terzo parametro che indica se trattare le costanti come case sensitive o no; dopo aver definito questo gruppo di costanti, è possibile utilizzare apc_load_constants per inserirle all'interno dello scope globale specificando come unico parametro la stringa che rappresenta il gruppo di costanti da caricare. Anche in questo caso abbiamo a disposizione un parametro aggiuntivo che indica se trattare le costanti in modo case sensitive o no.

L'ultima, utilissima, funzionalità di APC è quella che permette di salvare in memoria condivisa delle variabili in modo che risultino persistenti tra richieste diverse. Possiamo salvare risultati di interrogazioni o elaborazioni molto complesse, assicurandoci che queste non vengano più eseguite per un determinato lasso di tempo. Tramite la funzione apc_store, che accetta come parametri l'identificativo della variabile da salvare, il valore della variabile ed un numero indicante i secondi di vita della stessa, possiamo salvare in memoria condivisa dei dati. Successivamente questi possono essere recuperati attraverso apc_fetch che accetta come parametro l'identificativo riferito ai dati salvati o rimossi manualmente utilizzando apc_delete.

Dalle ultime versioni della libreria è possibile passare un array alla funzione apc_fetch in modo da recuperare in un colpo solo tutti i valori necessari, evitando chiamate ripetitive alla funzione. È utile ricordare anche che apc_store pare non funzionare correttamente nel caso venga passato come secondo parametro un array; per ovviare al problema è possibile utilizzare l'oggetto ArrayObjects disponibile con PHP 5.

Ti consigliamo anche