Creare con PHP siti web con un numero elevato di visite

Nel caso ci si trovi di fronte alla necessità di gestire un sito web con un numero elevato di visite, il comune approccio usato nello sviluppare pagine PHP potrebbe non essere sufficiente.

Quando

Se pensiamo ad un sito web normale con alcuni elementi dinamici, ogni pagina richiede un certo numero di query. Siti web con funzioni di content management, come la maggior parte dei portali e alcuni siti personali, richiedono numerose query in ogni pagina.

La prima conseguenza è che il database viene caricato di lavoro e la conseguenza ultima è che le pagine vengono servite più lentamente appena il numero di utenti del sito cresce.

Questo scenario si può verificare sia in siti piccoli, se utilizzano una macchina condivisa in cui ci sono numerosi altri siti web, sia su sistemi più grandi.

E' possibile riflettere un attimo sui numeri, correlandoli con il tipo di server che si ha a disposizione.

Server condiviso

Su un server condiviso, bisogna considerare i seguenti fattori:

  • Se i problemi di prestazioni sono legati al server HTTP, ovvero se ci sono problemi di prestazioni (anche) nel servire pagine statiche. In questo caso l'unica soluzione è cambiare il server, passando a un server più veloce o ad una soluzione dedicata; lo sviluppatore non ha modo per ottimizzare il proprio sito.
  • Se i problemi di prestazioni sono legati alla complessità del codice PHP, che richiede un tempo di computazione elevato. In questo caso è opportuno pensare a una cache.
  • Se i problemi di prestazioni sono legati a elementi esterni al codice PHP che non rispondono in modo adeguato. Noi considereremo solo problemi di prestazioni esterni dovuti a lentezza del database, e anche in questo caso è opportuno pensare a una cache.

Sviluppare una cache significa sviluppare un meccanismo che crei una versione "veloce" delle vostre pagine da servire quando i contenuti non sono aggiornati.

In alternativa è possibile servire le pagine compresse; i browser supportano pagine compresse ormai dalla versione 4 di Netscape, e questo comporta vantaggi in termine di tempo necessario per servire la pagina e di banda utilizzata: una pagina compressa ha una dimensione fino a 1/4 di quella di una pagina non compressa.

Due soluzioni alternative disponibili open source sono jpcache e smarty, e prima di sviluppare la vostra soluzione personalizzate potete studiare il loro funzionamento.

Jpcache offre il vantaggio di essere in grado di fornire anche pagine compresse. Smarty è un complesso sistema a template che ha come svantaggio principale il fatto che introduce un linguaggio specifico per i template.

Server dedicato

In questo caso lo sviluppatore, se è anche l'amministratore del server, ha a disposizione più alternative.

Se il sito non ha un numero troppo eccessivo di visite, è possibile utilizzare sistemi analoghi a quelli per i server condivisi. Ma in casi drastici (es. siti che occupano 5 gbit di banda) bisogna pensare a soluzioni drastiche.

Ovviamente il primo passo da fare è creare un cluster di server, e dedicare (almeno) un computer separato al web server e uno al database server.

Il passo successivo, se le prestazioni non sono ancora adeguate, è:

  • moltiplicare il numero di computer del cluster: più computer si distribuiscono il carico di lavoro da svolgere
  • mettere un HTTP accelerator daventi al cluster di computer. Un HTTP accelerator permette di creare copie cache delle richieste degli utenti e di servirle in modo statico, senza dover passare la richiesta al web server e al database server.

Squid è il più famoso degli HTTP accelerator. Disponibile sia per unix che per windows, permette se configurato correttamente di salvare situazioni disperate.