2014-08-08 4 views
2

У нас есть большое приложение php и попытка отладки медленных запросов sql, мы хотели бы иметь возможность автоматически комментировать, какой файл на самом деле называется SQL-запросом , что-то вроде:PHP, комментарий Auto SQL, отладка базы данных и строка под названием sql

"select /* filename.php line 234*/ `ID`,`Email`, `NickName`, `AlertBusiness`,`City` from People where ?=? and limit ?,?" 

где/* filename.php строка 234 */вставлена ​​динамически. Возможно

В PHP есть debug_backtrace, http://php.net/manual/en/function.debug-print-backtrace.php

Что может сделать это вручную:

<?php 

$query = sprintf("INSERT INTO EventLog (Trace) VALUES ('%s')", 
    mysql_real_escape_string(join("\n", debug_backtrace()))); 
mysql_query($query); 

?> 

Но надеялся на что-то более центральной, как в драйвере дб.

MediaWiki имеет аналогичную функцию. http://www.mediawiki.org/wiki/Manual:How_to_debug

You can also enable backtrace on SQL error by setting $wgShowDBErrorBacktrace: 

$wgShowDBErrorBacktrace = true;" 

драйвер PDO имеет разгрузочный заявление, но это только вопрос, не назвавший его http://php.net/manual/en/pdostatement.debugdumpparams.php

Как вам лучше отладки SQL в контексте страницы PHP запустить его?

+0

_ «MediaWiki имеет аналогичную функцию» _ - вполне уверен, что они реализованы так же «вручную», как в вашем первом примере ... – CBroe

+0

Посмотрите на этот вопрос и ответы http://stackoverflow.com/q/4777517/ –

+0

Вы можете написать свой собственный класс базы данных, который вызывает PDO, после обработки запросов. – Barmar

ответ

0

Возможно, это слишком просто, но вы можете включить slow query log в MySQL и найти лучшие 10-25 медленных запросов.

После того, как у вас есть список медленных запросов, вы можете использовать Percona Toolkit для их анализа.

Я бы использовал ack/ack-grep, чтобы найти виновника и где он живет. Если у вас есть большое количество файлов, вызывающих вызовы непосредственно в MySQL, будет больно входить и маршрутизировать их через метод, который добавляет/присоединяет комментарий MySQL к запросу и может быть не самым эффективным.

Если у вас несколько приложений, подключающихся к одной базе данных, лучше также разделить пользователей, чтобы вы могли определить, какие пользователи/приложения потребляют ресурсы базы данных.