CakePHP : cronometrare la propria applicazione

ATTENZIONE! Il post ha più di 2 anni e le informazioni contenute potrebbero essere obsolete (ad esempio a causa di un aggiornamento di versione rispetto agli elementi descritti o links modificati da siti esterni).

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.

 

Condividi questo post


Commenti