Показать все SQL запросов за один PHP скрипт - PullRequest
0 голосов
/ 19 марта 2020

В PHP существует долгоживущий крупный проект, в разработке которого в разное время был задействован ряд разных разработчиков. Потенциально, возможно, были места, где повторяющиеся запросы к базе данных были сделаны во время исправления ошибок. Некоторые разработчики для решения локальной проблемы могут написать и выполнить запрос, возвращающий ранее полученные данные. Сейчас в проекте существует проблема производительности БД, и в свете этого возникает вопрос:

Существуют ли какие-либо инструменты (помимо General Log), которые позволяют вам видеть, какие запросы к базе данных были выполнены как часть одного PHP выполнения скрипта?

Вопрос связан с тем, что в проекте много конечных точек API, и потребуется много времени, чтобы проверить их все просто чтение кода (который иногда очень витиеват).

1 Ответ

0 голосов
/ 20 марта 2020

Большинство PHP фреймворков используют единый интерфейс подключения - своего рода оболочку - который позволяет регистрировать все запросы через этот интерфейс.

Если такого не существует, другой подход будет включать регистрацию на MySQL -уровень. Но для некоторых, вероятно, le git, причина, по которой вы тоже не хотите этого делать. Если вы хотите предотвратить простои, вы можете включить ведение журнала запросов без перезапуска сервера MySQL.

Если ни одно из вышеперечисленных решений не возможно, вам нужно запачкать руки :-)

Одним из способов может быть добавление собственной регистрации в коде PHP. Запись новых строк в файл не является проблемой производительности, если вы записываете в конец файла .

Я не уверен, как вы запрашиваете базу данных, но если вы ..

A) ..use процедурные функции mysqli

Если вы используете процедурные функции mysqli, такие как mysqli_query (), для вызова базы данных, вы можете создать собственную глобальную пользовательскую функцию, которая записывает в файл журнала и затем вызывает реальную функцию.

Пример:

Добавьте новую глобальную функцию:

function _mysqli_query($link, $query, $resultmode = MYSQLI_STORE_RESULT )
{
    // write new line to end of log-file
    file_put_contents('queries.log', $query . "\n", FILE_APPEND);

    // call real mysqli_query
    return mysqli_query($link, $query, $resultmode);
}

Выполните поиск по всему проекту и замените mysqli_query ( на _mysqli_query (.

). Затем строка, подобная этой:

$result = mysqli_query($conn, 'select * from users');

будет выглядеть так после поиска и замены :

$result = _mysqli_query($conn, 'select * from users');

B) ..use класс mysqli (объектно-ориентированный стиль)

Если вы используете объектно-ориентированный стиль путем создания экземпляра класса mysqli с последующим вызовом методы запроса, например $ mysqli-> query ("select * from users"), подход может быть создайте свой собственный класс базы данных, который расширяет класс mysqli, и внутри указанных методов c (например, функции запроса) вы добавляете запись в журнал, как в приведенном выше примере.

В очень рекомендуемой книге "Высокая производительность MySQL "от O'Reilly они go через примеры кода, как это сделать и добавить дополнительную отладочную информацию (хронометраж et c.). Некоторые страницы доступны в книгах Google .

В общем

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

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

Если вы не практикуете автоматическое тестирование, вы должны протестировать все приложение вручную.

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

Схема производительности в MySQL может помочь вам отладить эти вещи, если вы обнаружите, что c действительно, что это может быть другие причины проблем с производительностью.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...