Optimizare PHP și MySQL: funcție pentru măsurarea timpului de execuție a interogărilor

Performanța bazei de date MySQL reprezintă unul dintre cele mai importante aspecte în dezvoltarea și întreținerea unui site web de succes. O bază de date bine optimizată trebuie să răspundă rapid interogărilor și să consume cât mai puține resurse de procesare și memorie pe server.

Pentru a identifica interogările lente (bottlenecks) și pentru a optimiza structura tabelelor sau a indecșilor, este util să monitorizăm durata fiecărui query executat în timpul încărcării unei pagini.

Funcție PHP pentru contorizarea timpului de execuție

Iată o funcție simplă și eficientă scrisă în PHP, pe care o folosesc pentru a intercepta și măsura timpul necesar fiecărei interogări către baza de date:

<?php
/**
 * Trimite interogarea spre serverul MySQL și măsoară durata execuției
 *
 * @param string $query Interogarea SQL care urmează să fie executată
 * @return resource Rezultatul interogării returnat de server
 */
function send_query($query) {
    global $debug, $queries, $count, $last_query, $total;

    if ($debug == 1) {
        $queries[$count]['query'] = $query;
        $start = getmicrotime();
    }

    $temppp = mysql_query($query);

    if ($debug == 1) {
        $last_query = $query;
        $end = getmicrotime();
        $queries[$count]['time'] = round($end - $start, 8);
        $count++;
        $total = $total + ($end - $start);
    }

    return $temppp;
}

/**
 * Returnează timpul curent în secunde și microsecunde sub formă de număr în virgulă mobilă
 *
 * @return float Timpul curent
 */
function getmicrotime() {
    list($usec, $sec) = explode(" ", microtime());
    return ((float)$usec + (float)$sec);
}
?>

Cum funcționează măsurarea cu microtime()

Funcția getmicrotime() se bazează pe funcția nativă microtime() din PHP. În mod implicit, apelată fără parametri, microtime() returnează un șir de caractere de forma "msec sec" (de exemplu "0.12345600 1234567890"). Prin funcția explode(), descompunem acest șir și adunăm cele două valori convertite la tipul float, obținând un timestamp precis cu zecimale.

Scăzând valoarea $start din $end, aflăm exact numărul de fracțiuni de secundă necesare pentru ca serverul MySQL să proceseze interogarea și să returneze setul de date.

Recomandări pentru versiuni moderne de PHP

Deși codul de mai sus reflectă implementările clasice din PHP 4 și 5, merită subliniate două îmbunătățiri majore pentru mediile de producție actuale:

  • Parametrul float pentru microtime: Începând cu PHP 5, funcția microtime(true) acceptă parametrul boolean $as_float, returnând direct timestamp-ul ca număr în virgulă mobilă, fără a mai necesita funcția ajutătoare getmicrotime().
  • Migrarea către PDO sau MySQLi: Extensia învechită mysql_* a fost declarată perimată în PHP 5.5 și eliminată complet în PHP 7.0. În aplicațiile moderne, este obligatoriu să folosim extensiile PDO sau MySQLi, care oferă suport pentru interogări pregătite (prepared statements) și protecție împotriva injecțiilor SQL.

Lasă un comentariu