CakePHP : cronometrare la propria applicazione
In un'applicazione possono esserci dei punti critici che ne rallentano l'esecuzione; nelle applicazioni web molto spesso capita in presenza di query molto pesanti al database e magari non ottimizzate oppure nel caso di chiamate ad API che si connettono a servizi esterni.
Per capire dove l'applicazione "rallenta" è utile inserire dei punti di controllo all'interno delle varie funzioni (soprattutto quelle più critiche) per visualizzare in fase di debug i tempi impiegati per l'esecuzione e capire subito dove si deve intervenire.
Come prima cosa inserire nell'AppController le seguenti funzioni (o creare l'AppController se non c'è già):
<?php
/**
* Controller principale, gli altri controller vengono ereditano da questo.
* Contiene tutti i metodi di base per il sito (es. autenticazione) e i metodi comuni
* a tutti i controllers.
*/
class AppController extends Controller {
/**
* Punti di test
*/
public $test_points = array();
/**
* Funzione di callback richiamata all'inizio dell'applicazione.
*/
function beforeFilter() {
//aggiunge il primo punto di test dell'applicazione - time:0
$this->_testPoint('Start');
}
/**
* Funzione di callback richiamata prima della visualizzazione di una pagina.
*
*/
function beforeRender(){
//imposta la variabile $test_points contenente un array
//con tutti i punti di test richiamati nell'esecuzione corrente
$this->set('test_points',$this->test_points);
}
/**
* Aggiunge un punto di test
*
* @param String $text Testo da visualizzare
*/
function _testPoint($text){
if(Configure::read('debug')==2){
$this->test_points[] = array(
'time' => microtime(true),
'text' => $text
);
}
}
}//END AppController
Successivamente creare un Element "debug.ctp" (nella directory views/elements/) con il seguente contenuto:
<?php if(Configure::read('debug')==2): ?>
<style type="text/css">
.debug_container{
position: absolute;
height: 200px;
width: 100%;
overflow-y: scroll;
overflow-x: hidden;
z-index: 500;
left: 0;
background-color: #fff;
border: 1px solid blue;
}
.debug_container_table{
margin: 15px;
}
.debug_container_table tr:hover td{
background-color: #B9D5FF;
}
.debug_container_table tr td,.debug_container_table tr th{
padding: 0 10px;
}
</style>
<!-- DEBUG -->
<div class="debug_container">
<table class="debug_container_table">
<tr>
<th>n°</th>
<th>Absolute Time (s)</th>
<th>Relative Time (s)</th>
<th>Point</th>
</tr>
<?php
//cicla i punti di test
foreach($test_points as $k=>$v):
//imposta il tempo iniziale
//(serve per il calcolo dei tempi successivi)
if($k==0){
$time_start = $v['time'];
//nella prima esecuzione del ciclo il tempo del punto
//precedente è uguale a quello attuale, in questo
//modo il risultato della sottrazione è uguale a zero
$time_before = $v['time'];
}
?>
<tr>
<td><?php echo $k+1; ?></td>
<td><?php echo round($v['time'] - $time_start,3); ?></td>
<td>+<?php echo round($v['time'] - $time_before,3); ?></td>
<td><?php echo $v['text']; ?></td>
</tr>
<?php
//salva il tempo del punto attuale per la prossima esecuzione del ciclo
$time_before = $v['time'];
endforeach;
?>
</table>
<hr>
<?php
//visualizza il dump sql
echo $this->element('sql_dump');
?>
</div>
<!-- end DEBUG -->
<?php endif; ?>
Il CSS è interno per praticità, ovviamente è possibile spostarlo in un file esterno. Nel layout ora si deve aggiungere l'elemento creato nel seguente modo (nel footer o dove si ritiene più opportuno):
<?php echo $this->element('debug'); ?>
A questo punto l'applicazione è pronta ed è possibile creare in qualsiasi controller uno o più punti di test nel seguente modo:
function test(){
$this->_testPoint('Funzione test: inizio');
//query....
$this->_testPoint('Funzione test: fine query');
}
Quando sarà impostato debug = 2 (nel file config/core.php) sarà possibile visualizzare le informazioni di debug.
Commenti