Я работаю над PHP-приложением, которое обрабатывает запросы в текстовом поле и возвращает разбитые на страницы результаты. В рамках приложения я хочу сообщить время выполнения запроса.
Вот что я сделал до сих пор.
Я начал с включения профилирования путем прямого ввода в текстовое поле и запуска скрипта:
set global profiling = 1
Используя предоставленное текстовое поле, введите следующий запрос:
select @@profiling
И получить:
1
Наконец, я запускаю запрос так:
select * from log
Однако, когда я запускаю команду для профилирования запроса:
show profiles
Я не получаю никакого результата, и на странице не отображается содержание.
Поскольку я не вижу таблицы после команды «показать профили», значит ли это, что нет достаточных привилегий или мне не хватает другого шага?
Я следовал процедуре:
Измерение фактического времени выполнения MySQL
Пожалуйста, порекомендуйте.
Мой PHP-код выглядит следующим образом:
<?php if($_POST) { $db = new PDO('mysql:host=localhost;dbname=<dbname>;charset=utf8', 'user', 'pass'); $stmt = $db->prepare($_POST['query']); $stmt->execute(); $records = $stmt->fetchAll(PDO::FETCH_ASSOC); $errmsg = $stmt->errorInfo()[2]; //Output the error message - Index 2 of the array echo $errmsg; } ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"> <head> <title>Log</title> </head> <body> <form method="post" id="queryform"> <div class="label"> <span class="label">Enter SQL Query</span> </div> <div class="input"> <input type="text" name="query" size="150" value="<?=$_POST['query']?>" /> </div> </form> <? if (isset($records)): ?> <table border="1"> <? foreach($records as $record): ?> <tr> <? foreach($record as $colname => $value): ?> <td> <?=$value;?> </td> <? endforeach; ?> </tr> <? endforeach; ?> </table> <? endif; ?> </body> </html>
Любая помощь будет оценена по достоинству.
Это работало как прелесть!
$db->query('set profiling=1'); //optional if profiling is already enabled $db->query($_POST['query']); $stmt = $db->query('show profiles'); $db->query('set profiling=0'); //optional as well $records = $stmt->fetchAll(PDO::FETCH_ASSOC); $errmsg = $stmt->errorInfo()[2]; //Output the error message
UPDATE (Ниже приведена следующая работа над innodb на моей нынешней настройке)
$db->query('set profiling=1'); //optional if profiling is already enabled $db->query($_POST['query']); $res = $db->query('show profiles'); $records = $res->fetchAll(PDO::FETCH_ASSOC); $duration = $records[0]['Duration']; // get the first record [0] and the Duration column ['Duration'] from the first record
Результат (показать профили) из phpmyadmin.
Query_ID Duration Query 1 0.00010575 SELECT DATABASE()
Получение фактического (абсолютного) времени выполнения последнего запроса в PHP (исключая латентность сети и т. Д.)
Как насчет этого:
$start = microtime(true); $stmt->execute(); $end = microtime(true); echo "This query took " . ($end - $start) . " seconds.";