2011-02-04 3 views
1

Я регулярно сталкиваюсь со следующей ситуацией; Я работаю над существующей системой, созданной на PHP, которая что-то делает, на самом деле довольно много, и обычно она состоит из большого количества кода. Теперь мне нужно расширить некоторые функции, отладить что-то и узнать, как система взаимодействует с MySQL-DB. Какие запросы выполняются в каком порядке.Как перехватывать DB-запросы? (MySQL)

Как перехватить все запросы? Что-то вроде xdebug_start_trace для базы данных.

EDIT: Централизованная обработка запросов БД отсутствует. Вы найдете там все виды запросов. Поэтому мой вопрос направлен на некоторые функции каротажа. В принципе, это должно существовать, поскольку здравый смысл заключается в том, что что-то подобное может быть полезно.

EDIT2: Марио предложило решение, которое зависит от перезапуска mysql-deamon ... no. Дополнительные предложения?

+0

Есть ли один класс, который обрабатывает все подключения к базе данных MySQL? –

+0

Я сомневаюсь, что это можно сделать по устаревшему коду, используя необработанные функции API. –

+0

Если существующий код использует mysql_query() напрямую, то последним вариантом было бы попробовать runkit_function_rename() и определить функцию-оболочку, которая перехватывает все вызовы. Или еще худшая альтернатива: запустите сокет через netcat | tee | netcat или используйте сетевой сниффер. – mario

ответ

2

Вы можете использовать MySQL «общий журнал запросов», начиная с mysqld с параметром --log=fn. http://dev.mysql.com/doc/refman/5.1/en/query-log.html

+0

I ** fear ** вот что я искал, потому что он решает проблему, но я не могу применить его, потому что у меня нет доступа к БД и не могу перезапустить его с помощью этой опции: -/ – Raffael

+0

@ Raffael1984: Это то что я как ожидается, будет прервано там. Тогда ваш единственный вариант - сделать временную модификацию приложения и выполнить поиск и замену mysql_query ('с помощью mysql_query_ (' для добавления надежной функции-обертки и поддержки пользовательских журналов. – mario

1

Если вы проходите PDO, вы можете расширить его на строки журнала или эхо-запросов.

<?php 
class PDODebug extends PDO 
{ 
    public function exec ($statement) 
    { 
     var_dump ($statement); // Or log to a file or use firePHP to log to the console 
     return (parent::exec ($statement)); 
    } 
    public function query ($statement) 
    { 
     var_dump ($statement); // Or log to a file or use firePHP to log to the console 
     return (parent::query ($statement)); 
    } 
} 
?> 

Теперь в вашем коде создать новый PDODebug, где бы вы создать PDO и запросы выполняются через него будут регистрироваться. Если вы используете другой интерфейс базы данных OO (например, MySQLI), вы можете сделать что-то подобное.

Если вы используете не-OO-уровень доступа (например, функции mysql_ *), вам нужно будет добавить echo или var_dump или что-то еще перед каждым использованием функции mysql.

+0

система действительно огромна, и нет централизованной обработки db, поэтому любое расширение расширения-класса было бы более сложным, чем просто наличие дампа DB запросов в некотором текстовом файле – Raffael

Смежные вопросы