Skip to main content

PHP lock e semafori con WinCache e/o APC

Alzi la mano chi, lavorando con PHP, non ha mai avuto la necessità di limitare l’accesso simultaneo a una funzione o a un metodo di una classe. Si tratta di un’esigenza tipica delle cosiddette maintenance task, ovvero di quelle procedure eseguite a intervalli regolari senza l’ausilio di un cron job vero e proprio ma al primo accesso di un qualsiasi utente a partire da una determinata ora. E’ probabile che, se vi siete imbattuti in questo articolo, siate alla ricerca di un modo per impedire che l’accesso simultaneo di più utenti possa provocare l’esecuzione simultanea della medesima task prima del completamento della stessa.

In altri linguaggi di programmazione (ASP.NET/C#, Phyton et. al.) questa esigenza si risolve facilmente utilizzando procedure di thread synchronization come i ben noti semafori o lock, in modo simile al seguente esempio (C#):

In PHP, contraddistinto sotto Windows da una implementazione thread-unsafe e, sotto Linux, da una esecuzione isolata per ciascun processo, non esiste una funzionalità nativa per ottenere un lock di questo tipo. Un tipico workaround utilizzato dagli sviluppatori è quello di ricorrere al flock(), una tecnica di lock basata sulla creazione di semafori creati direttamente sul filesystem: in poche parole, un lock ottenuto sfruttando la creazione/presenza/eliminazione di un file che fa le funzioni di semaforo e ha il compito di tenere sincronizzati i thread/processi. Pur trattandosi di un approccio assolutamente percorribile, questa tecnica ha almeno due difetti: le performance non eccezionali – dovute alla necessità di effettuare frequenti operazioni IO – e la scomodità di dover gestire i file/semafori con tutto quello che ne consegue – path, permessi e via dicendo. Fortunatamente esiste un metodo decisamente più pratico, a patto che l’installazione PHP preveda l’utilizzo di una delle numerose librerie di caching disponibili. Le più note e utilizzate sono:

  •  WinCache, di cui abbiamo già avuto modo di parlare in un paio di occasioni, realizzata da Microsoft e disponibile in tutte le distribuzioni PHP per Windows.
  • APC, scaricabile dall’apposita pagina PECL.

Trattandosi di librerie dedicate alla gestione di un’area di cache condivisa tra i vari processi/thread di esecuzione PHP, ciascuna di esse prevede una funzione specifica per acquisire il lock: vediamo quali sono e come implementarli all’interno del nostro codice.

Nella lista non è presente OPCache, l’ottima libreria sviluppata da Zend e disponibile in tutte le distribuzioni di PHP recenti per Windows e Linux, perché – almeno allo stato attuale – non mette a disposizione dello sviluppatore una user cache su cui poter intervenire in modo arbitrario.

(altro…)

 

PHP & WinCache: come visualizzare statistiche e informazioni d’uso

Se avete installato WinCache sul vostro web server (magari grazie alla nostra guida) e volete dare un’occhiata a quello che succede dietro le quinte vi consigliamo di installare questo comodo script che vi consentirà di visualizzare, attraverso le API dell’estensione, una serie di informazioni relative ai vari aspetti delle sue molteplici funzionalità.

Lo script non è farina del nostro sacco, è infatti presente nel pacchetto ufficiale dell’estensione (potete controllare se lo avete già sul vostro sistema consultando questa pagina) ma tende a non essere molto conosciuto e, di conseguenza, poco utilizzato. Un vero peccato, considerando la mole di informazioni utili che consente di ottenere!

Ecco come si presenta:

WinCache Control Script

Niente male, vero?

IMPORTANTE: Se il vostro web server supporta la Basic Authentication lo script è configurato per richiedere un Nome utente e una Password. Le credenziali predefinite sono wincache / wincache e possono essere cambiate modificando le prime linee di codice PHP presente all’interno:

Per disabilitare del tutto l’autenticazione e la richiesta di credenziali è sufficiente impostare la costante USE_AUTHENTICATION a 0.

 

 

PHP: Guida all’installazione di WinCache su IIS

Il principale collo di bottiglia della maggior parte dei software basati su PHP è quasi sempre legato all’utilizzo della memoria da parte dell’interprete dei comandi. Nel caso di siti poco frequentati questo può essere un problema trascurabile, ma quando un blog in WordPress o un sito commerciale in Joomla comincia a diventare popolare i nodi cominciano a venire al pettine: pagine che caricano sempre più lentamente, request che si accavallano e un senso generalizzato di lentezza che verrà puntualmente confermato da strumenti di monitor come Yslow (se ancora non lo utilizzate, correte a installarlo!), Analytics etc.

Per migliorare le sorti di un sito in PHP molto trafficato che gira sotto IIS è possibile installare una delle estensioni gratuite di cache attualmente a disposizione: in questo articolo parleremo del sistema di cache proprietario messo a punto dalla Microsoft e chiamato WinCache, installabile gratuitamente e incluso nel pacchetto base delle versioni di PHP per Windows dalla 5.2 in poi. Questa estensione garantisce un notevole incremento prestazionale grazie a una cache a 5 livelli:

  • OPCode Cache: Caching degli script compilati a livello di bytecode, per evitare che il sistema processi più volte lo stesso identico script.
  • File Cache: Caching dei file php veri e propri, risparmiando al sistema numerosi accessi al disco per leggere più volte gli stessi identici file.
  • Resolve File Path Cache: Caching dei path assoluti degli script, in molti casi costruiti grazie a funzioni di risoluzione ripetute decine di volte nel corso del codice. Il sistema memorizza il mapping tra path relativi e assoluti evitando così di eseguire le operazioni di risoluzione.
  • User Cache: Caching degli oggetti e variabili create a livello di singolo utente, per evitare di dover ricreare le stesse cose di processo in processo.
  • Session Cache: Un vero e proprio session manager che consente di memorizzare le informazioni di sessione dell’utente evitando le frequenti operazioni sul file-system tipicamente richieste dal sistema di sessioni normalmente utilizzato da PHP (la classica cartella /sessiondata/), velocizzando inoltre il recupero dei dati di sessione.

Installare WinCache è estremamente semplice. Per prima cosa occorre assicurarsi che il file dll relativo all’estensione sia incluso nell’installazione PHP presente sul nostro sistema. In altre parole, il file php_wincache.dll dev’essere presente nella sottocartella /ext/ contenuta nella directory di installazione di PHP. Nel caso in cui non ci fosse è possibile scaricare una versione aggiornata della libreria dal sito ufficiale di WinCache (assicurandovi di selezionare il file compatibile con la vostra versione di PHP) e copiarla manualmente nella cartella suddetta.

Una volta fatto questo occorre abilitare l’estensione aggiungendo le seguenti due righe al proprio file php.ini, normalmente presente nella directory di installazione di PHP oppure nella cartella di installazione di Windows.

IMPORTANTE: Prima di aggiungere queste righe è consigliabile accertarsi che l’estensione non sia già abilitata effettuando una rapida ricerca di “php_wincache.dll” all’interno del file.

Se utilizzate PHP Manager per IIS (cosa altamente consigliabile) potete anche installare l’estensione anche attraverso la GUI fornita da questo ottimo programma.

Se non utilizzate PHP Manager e/o non avete idea di dove si trovi il vostro php.ini potete rintracciarlo eseguendo il comando phpinfo() sul vostro server (se non sapete cosa significa cliccate qui per ottenere uno script da caricare ed eseguire) e, una volta fatto, dare un’occhiata al parametro Loaded Configuration File:

Loaded Configuration File

Il comando phpinfo() può essere utilizzato anche per verificare che l’estensione WinCache sia stato installata correttamente. In caso affermativo troverete infatti una sezione fatta più o meno in questo modo:

Wincache configuration in PHPInfoCon tutta probabilità, come nell’immagine di cui sopra, il sistema vi informerà che le cache sono disabilitate. La cosa è del tutto normale: l’estensione è presente ed è stata correttamente installata, ma non è ancora attiva.

Per attivarla è necessario aggiungere al file php.ini una serie di parametri di configurazione nel seguente modo:

I parametri sopra elencati sono grosso modo adeguati per un server di produzione: per esigenze specifiche si consiglia di consultare la documentazione di riferimento di WinCache, che contiene una spiegazione dettagliata di ciascun parametro e le indicazioni di base su come impostare l’estensione nel modo adeguato.

Se si desidera abilitare anche la Session Cache e utilizzare WinCache come session handler è inoltre necessario modificare il seguente parametro, sempre nel php.ini:

Al termine della configurazione, e dopo un necessario riavvio di IIS, sarà possibile verificare il risultato dei propri sforzi eseguendo nuovamente il comando phpinfo():

PHPINFO: wincache enabled