Разбираясь как работает та или иная CMS приходится использовать различные инструменты, облегчающие работу.
Наиболее интересная тема — это работа с баз(ой|ами) данных. Естественно для изучения запросов и результатов запросов нужно использовать что-то универсальное. Что-то, что будет работать стабильно как с известным движком, так и с самописной системой.
Предположим у вас оказалась система управления контентом и вам необходимо посмотреть как реализовано добавление новых пользователей или смена паролей.
Большинство инструментов позволяющих мониторить работу с БД являются платными [раз, два]. Я хотел что-то более легкое и удобное, поэтому выбрал mysql-proxy. Хотя возможности утилиты гораздо шире чем мне требуется, я опишу лишь основное. Работает как под Windows, так и под Unix системами.
Скачать можно тут: dev.mysql.com/downloads/mysql-proxy/
Первым делом нужно определиться с выбором дистрибутива. На данный момент новейшей версией является «MySQL Proxy 0.8.3 alpha», в качестве ОС у меня стоит Windows 7, поэтому все тесты будут на ней.
После нажатия на кнопку «Download» вас попросят авторизироваться либо зарегистрировать, но снизу есть ссылка для скачивания без лишних действий. (В репозиториях Ubuntu и Debian есть готовые пакеты, так что: sudo apt-get install mysql-proxy)
Хочу заметить, что при размере в 7.9Мб в дистрибутив входит Lua с поддержкой основых модулей.
После скачивания архива его нужно распаковать в удобную для вас директорию, возьмем для примера C:mysql-proxy
Для запуска приложения нужно определиться с параметрами.
В данном контексте многое зависит от того, что у вас установлено. В качестве LAMP я использую Winginx, прочитать об этой связке можно тут: winginx.ru/
По умолчанию MySQL работает на 3306 порту, его мы трогать не будем.
Нам нужно изменить порт для подключения php к базе. Для этого необходимо поправить php.ini
Найдем строку «mysql.default_port» и установим порт (по умолчанию 4040). Для более универсальной работы измените и «mysqli.default_port» на 4040
Подготовительная часть пройдена, перейдем к делу.
Вариант 1. Мониторинг запросов.
Для простого мониторинга необходимо использовать Lua скрипт. Как я уже говорил Lua идет в комплекте, так что ничего нового устанавливать не надо.
Создадим простой скрипт view.lua в директории C:mysql-proxy с содержимым:
function read_query(packet)
if string.byte(packet) == proxy.COM_QUERY then
print(string.sub(packet, 2))
end
end
Теперь можно проверить, результат.
Для удобства создадим в директории C:mysql-proxy файл view.bat c содержимым:
C:mysql-proxybinmysql-proxy.exe --proxy-lua-script=C:mysql-proxyview.lua --log-file="C:mysql-proxymysql-proxy-log.txt" --proxy-backend-addresses=localhost:3306
--proxy-backend-addresses — адрес MySQL сервера на который будем проскить запрос.
Запустив вэб-сервер и выполнив какие либо запросы к базе можете увидеть такое:
Запросы отображаются, хорошо.
Вариант 2. Мониторинг запросов и запись в файл.
Для записи запросов в файл будем использовать штатные возможности Lua.
Создадим файл view-write.lua в директории C:mysql-proxy с содержимым:
function read_query(packet)
if string.byte(packet) == proxy.COM_QUERY then
local file = io.open("C:\mysql-proxy\sql-log.txt", "a")
file:write(string.sub(packet, 2) .. "n")
file:close()
print(string.sub(packet, 2))
end
end
и bat файл — «view-write.bat»
C:mysql-proxybinmysql-proxy.exe --proxy-lua-script="C:mysql-proxyview-write.lua" --log-file="C:mysql-proxymysql-proxy-log.txt" --proxy-backend-addresses=localhost:3306
Результат после выполнения запросов (по адресу «C:mysql-proxysql-log.txt»)
Помимо отображения самих запросов, нам может понадобиться вывод результатов этих запросов.
Вариант 3. Запросы и результат
По той-же схеме создаём скрипт «view-result.lua»:
function read_query( packet )
if packet:byte() == proxy.COM_QUERY then
print("Query: " .. string.sub(packet, 2))
local file = io.open("C:\mysql-proxy\sql-log.txt", "a")
file:write("Query: " .. string.sub(packet, 2) .. "n")
file:close()
proxy.queries:append(2, string.char(proxy.COM_QUERY) .. string.sub(packet, 2), {resultset_is_needed = true} )
proxy.queries:append(1, packet, {resultset_is_needed = true})
return proxy.PROXY_SEND_QUERY
end
end
function read_query_result(inj)
if inj.id == 1 then
for row in inj.resultset.rows do
local i = 1
local fields = {}
while row[i] do
if row[i] == row then break end
local file = io.open("C:\mysql-proxy\sql-log.txt", "a")
file:write("Response field: " .. inj.resultset.fields[i].name .. " => " .. row[i] .. "n")
file:close()
print("Response field: " .. inj.resultset.fields[i].name .. " => " .. row[i])
i = i + 1
end
end
return proxy.PROXY_IGNORE_RESULT
end
end
И view-result.bat
C:mysql-proxybinmysql-proxy.exe --proxy-lua-script="C:mysql-proxyview-result.lua" --log-file="C:mysql-proxymysql-proxy-log.txt" --proxy-backend-addresses=localhost:3306
В результате получаем полное логирование запросов и ответов в читаемом виде
Автор: akamajoris