itaeng

CakePHP Supercache plugin

CakePHP è lento, dicono. E forse hanno anche ragione, benchmark alla mano, ma la vita reale è molto diversa da un benchmark ed io tutta questa lentezza non l'ho mai realmente percepita. Discorso ben diverso invece è gestire un sito molto visitato su un server con risorse limitate, cosa che può causare una lentezza dovuta, appunto, alle scarse prestazioni del server più che a quella del framework in se.

Tempo fa scoprii un fantastico plugin di Matt Curry che permetteva di creare dei file html statici, in modo del tutto trasparente all'utente finale, che fossero una copia esatta di una precedente elaborazione di CakePHP. Per farla semplice: la prima volta cakephp genera la pagina, la salva in un file html e la seconda volta visualizza direttamente il file html invece di ri-elaborare il tutto. Figata!

Implementai quel sistema ma mi resi conto che non era ancora una soluzione ottimale: il tutto si basava infatti comunque sull'infrastruttura di CakePHP (che quindi faceva comunque lavorare il server, se non altro per caricare il framework). Volevo qualcosa di più radicale.

CakePHP supercache plugin

Così mi misi a lavorare su qualcosa che facesse più o meno la stessa cosa e decisi di operare alla fonte: il file app/webroot/index.php. Questo mi permise di saltare totalmente l'infrastruttura di CakePHP facendo richiamare direttamente il file cache, quando richiesto. In pratica, poche righe di php (puro) per decidere cosa fare, per poi richiamare il framework o la cache a seconda delle necessità. Senza praticamente alcuno sforzo per il server. Non appena poi un utente effettua il login la cache viene automaticamente svuotata, così da evitare il rischio di mantenere in cache file obsoleti.

Installazione

Per installare questo plugin è necessario:

  • Creare la cartella app/webroot/cache, con permessi di scrittura;
  • rinominare il file app/webroot/index.php in app/webroot/index_cake.php;
  • scaricare il file index.php da github;
  • curiosare nel file ed indicare quali tipi di pagine debbano essere salvate in cache (il tutto è gestito in stile whitelist: di default nessuna pagina viene salvata tranne quelle specificate);
  • godersi il risultato.

Risultati

Per avere un'idea del risultato ho fatto qualche misurazione del consumo di memoria necessario alla visualizzazione della home page di questo stesso sito: senza il plugin abilitato la memoria utilizzata dal server per mostrare l'home page è di 3,78mb e 0.075281 secondi di elaborazione. Con il plugin attivato è di 768kb e 0.000977 secondi.

Mica male per un plugin così semplice da implementare, no?