Al mondo ci sono molti bravi webmaster ma purtroppo solo una piccola percentuale di essi si preoccupa anche dei problemi secondari dei propri siti. Detto questo oggi andiamo a studiare il problema della velocità degli script PHP e vedremo un semplice metodo per dare sprint al nostro interprete.

Iniziamo...

Per prima cosa dobbiamo sapere che tutte le pagine PHP prima di essere inviate dal server al client vengono processate da un interprete PHP, beh questo lo sanno tutti gli sviluppatori di questo linguaggio, ma pochi fanno caso al tempo che impiega l'interprete a generare l'intera pagina, per questo possiamo crearci una piccola porzione di codice che ci permetta di analizzare questo tempo:

$s=microtime();//a inizio pagina ancora prima di aver dichiarato il doctype andiamo a salvare in una variabile s il microtime

/*Contenuto HTML*/

echo "La pagina è stata generata in ".(microtime()-$s)." secondi";//e alla fine della pagina stampiamo il microtime sottraendogli quello iniziale

Cosi alla fine della pagina potremmo leggere il tempo di generazione. Più la pagina risulta pesante e complessa più il tempo di generazione aumenterà.

Quindi arriviamo finalmente al punto cruciale della guida, diminuire questo tempo di generazione. Prima di cercare di accelerare il processo di parsing dobbiamo capirlo e sapere che man mano che la pagina viene interpretata, l'output viene inviato al client, questo da il classico effetto caricamento a cascata, pero il suddetto comportamento di PHP comporta un grande spreco di risorse in quanto i dati che compongono la pagina vengono spediti in modo "spezzettato" rallentando il processo di parsing dell'interprete. Per ovviare a questo problema PHP ci da la possibilità di gestire l'output dell'interprete attraverso l'archiviazione in un buffer con le funzioni ob (output buffer) raggruppando tutto l'output in un unico invio.

Con la funzione ob_start() inizieremo l'archiviazione dell'output nel buffer e con la funzione ob_flush() rilasceremo l'output archiviato nel buffer, se omettiamo quest'ultima funzione l'output verrà inviato al client in automatico alla fine della generazione della pagina. Possiamo quindi capire che basti aggiungere solo ob_start() all'inizio della pagina per ottenere dei risultati, in questo modo l'output verrà inviato solo alla fine della interpretazione della pagina senza rallentare l'interprete con svariati invii di pacchetti TCP/IP.

Se adesso riprendiamo il nostro script per il calcolo del tempo di generazione della pagina e aggiungiamo all'inizio ob_start() ci accorgeremo subito quanto questa tecnica possa velocizzare il processo.

ATTENZIONE l'archiviazione nel buffer velocizza si la generazione della pagina, ma anche le funzioni come ob_start() hanno un tempo di esecuzione e se la pagina è molto breve il tempo recuperato grazie all'archiviazione nel buffer potrebbe essere minore al tempo di esecuzione della funzione ob_start(). Non vi spaventate però, questo non vi deve far desistere da usare questa funzione, in quanto i casi in cui questa essa dia dei rallentamenti sono rari e comunque il rallentamento sarebbe praticamente impercettibile.

Cosi abbiamo visto come aiutare l'interprete nel suo lavoro, ma possiamo fare di più, diminuendo pure il tempo di invio della pagina al client, infatti nel caso in cui il server non usi già la compressione gzip, possiamo pensarci noi con un semplice metodo. ob_start() accetta un argomento, una funzione da eseguire su l'output al momento del flush, la funzione che ci interessa è ob_gzhandler() che penserà alla compressione dell'output. La sintassi da usare è quindi ob_start("ob_gzhandler").

Ricapitolando

L'interprete per permettere un "caricamento a cascata" invia output al client man mano che la pagina viene generata, questo però rallenta il processo di interpretazione, si puo ovviare a questo problema con la funzione ob_start() posta all'inizio della pagina che archivia tutto l'output dell'interprete per poi inviarlo in una solo volta alla fine del processo, questo fa si che i tempi di generazione diminuiscano notevolmente. In più aggiungendo l'argomento "ob_gzhandler" a ob_start() i dati inviati al browser verranno compressi con gzip riducendo anche i tempi di invio.

Con questo concludo e spero che questa guida vi aiuti a creare pagine più veloci che aiutino anche i vostri utenti con le connessioni più lente.

Alla prossima ;-)