Статистика работы PHP и MySQL

Тема в разделе "Как сделать...", создана пользователем verfaa, 12 дек 2015.

  1. verfaa

    verfaa

    Регистр.:
    29 янв 2007
    Сообщения:
    375
    Симпатии:
    41
    Делаю один проект по фрилансу, заказчик попросил такой функционал:
    SQL Time: 0.0015
    и SQL запросов: 5

    Это я так понимаю общее количество запросов, выполненных при генерации скрипта и общее время, за которое они выполнились.
    Для подсчета общего количества запросов я планирую завести статическое свойство в классе и инкреминировать его при каждом SQL запросе. А как посчитать общее SQL Time?
    Прошу советов.
     
    Последнее редактирование: 12 дек 2015
  2. javx

    javx

    Регистр.:
    28 авг 2015
    Сообщения:
    527
    Симпатии:
    243
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    Кода много, получается прям лапша из кода, что сильно затрудняет восприятие...

    В функциях которые выполняют db_query и запускают цикл для получения результатов
    PHP:
    //поставь в начале функции
    $time microtime(true);
    ...
    //в конце
    $this->query_time += microtime(true) - $time;

    //Перед выводом на экран задай формат:
    echo " done (time: " sprintf('%.3f'$this->query_time) . "s)\n";
    Ну или через статик, если тебе так удобнее.
     
    Последнее редактирование: 12 дек 2015
  4. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    248
    Симпатии:
    143
    Так ведь тогда будут результаты выполнения 5 запросов отдельно, разве нет? Не проще ли в каждую функцию, где выполняется запрос в БД, добавить какой нибудь $GLOBALS['query']++ и в конце страницы выводить результат?
     
  5. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.450
    Симпатии:
    1.244
    $this->query_time += (будет суммировать)
    Предполагается, что класс БД доступен глобально и для всех запросов используется один и тот же объект. Если это не так используйте статик свойство (переменную). При инициализации присвойте ей 0.
     
  6. ykpon

    ykpon

    Регистр.:
    8 дек 2012
    Сообщения:
    248
    Симпатии:
    143
    Каюсь, + в += не заметил :ah:
     
  7. klxr

    klxr Постоялец

    Регистр.:
    14 апр 2015
    Сообщения:
    53
    Симпатии:
    68
    альтернативный вариант - делать через mysql profiling

    Код:
    mysql_query("SET profiling = 1;");
    if(mysql_errno()){die("ERROR ".mysql_errno($link).": ". mysql_error($link));}
    
    $query="SELECT some_field_name FROM some_table_name";
    $result = mysql_query($query);
    if(mysql_errno()){die("ERROR ".mysql_errno($link).": ". mysql_error($link));}
    
    $exec_time_result=mysql_query("SELECT query_id, SUM(duration) FROM information_schema.profiling GROUP BY query_id ORDER BY query_id DESC LIMIT 1;");
    if(mysql_errno()){die("ERROR ".mysql_errno($link).": ". mysql_error($link));}
    $exec_time_row = mysql_fetch_array($exec_time_result);
    
    echo "<p>Query executed in ".$exec_time_row[1].' seconds';
    
    альтернативный вариант - делать через mysql profiling

    Код:
    mysql_query("SET profiling = 1;");
    if(mysql_errno()){die("ERROR ".mysql_errno($link).": ". mysql_error($link));}
    
    $query="SELECT some_field_name FROM some_table_name";
    $result = mysql_query($query);
    if(mysql_errno()){die("ERROR ".mysql_errno($link).": ". mysql_error($link));}
    
    $exec_time_result=mysql_query("SELECT query_id, SUM(duration) FROM information_schema.profiling GROUP BY query_id ORDER BY query_id DESC LIMIT 1;");
    if(mysql_errno()){die("ERROR ".mysql_errno($link).": ". mysql_error($link));}
    $exec_time_row = mysql_fetch_array($exec_time_result);
    
    echo "<p>Query executed in ".$exec_time_row[1].' seconds';
    
     
    Последнее редактирование модератором: 13 дек 2015