SQLMon для Yii

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

Ситуацию частично исправило расширение под названием Yii DB profiler. Но остались некоторые неудобства:

  • Отображение запросов в порядке убывания времени выполнения — в принципе, это дело вкуса: при таком порядке сразу видны проблемные запросы. С другой стороны, лично мне более привычен хронологический порядок — так чётче прослеживается логика работы;
  • Prepared statements. Это просто здорово, но если повторять запрос в phpMyAdmin (например, если интересует план выполнения запроса), бывает очень муторно заменять все связанные значения. Например, для запросов вида
    [-]
    View Code MySQL
    SELECT 't'."object_id" AS "t0_c0", 't'."ymd" AS "t0_c1", 't'."black" AS "t0_c2", 't'."brown" AS "t0_c3", 't'."yellow" AS "t0_c4",
    't'."neutral" AS "t0_c5", 't'."white" AS "t0_c6", 't'."unknown" AS "t0_c7", 't'."error" AS "t0_c8", 'object'."object" AS "t1_c2",
    'object'."id" AS "t1_c0"
    FROM 'dnsbl_summary' 't'
    LEFT OUTER JOIN 'objects' 'object' ON ('t'."object_id"='object'."id")
    WHERE (((black > 0) OR (brown > 0)) AND
    (((((((((ymd=:ycp0) AND (black>:ycp1)) AND (brown=:ycp2)) AND (yellow=:ycp3)) AND
    (neutral>:ycp4)) AND (white>:ycp5)) AND (unknown=:ycp6)) AND (black>:ycp7)) AND
    (error=:ycp8))) AND (object.enabled = 1)
    LIMIT 50
    заменять все :ycpXXX на их значения немного муторно. В общем случае здесь вряд ли можно что-то сделать — заполнители параметров могут быть любыми (и даже позиционными), поэтому тупое использование str_replace может наделать делов.

Лично мне список запросов нужен обычно только для двух вещей:

  1. Оценка работы механизмов кэширования;
  2. Оценка плана выполнения запроса, составленная оптимизатором.

Первое обычно не критично (зачастую достаточно посмотреть на количество запросов), а вот второе позволяет выявить многие будущие проблемы с производительностью заранее.

В результате, взяв за основу Александра, я портировал SQLMon на Yii.
Далее »

Автор: , опубликовано в: Yii, комментариев: нет
22
Ноя
2011

KSES в WordPress: можно ли проще?

Вчера мне довелось разбираться с тем, как работает в .

KSES (рекурсивный акроним от KSES Strips Evil Scripts) — подсистема в WordPress (изначально написанная Ulf Harnhammar), предназначенная для проверки и очистки текста, введённого пользователем: она позволяет задать список допустимых тэгов, стилей и протоколов и на основе этих параметров убрать из текста пользователя всё, что им не соответствует.

KSES является довольно стабильной подсистемой; что немаловажно, KSES работает. Работает — не трогай, а то сломаешь… Далее »

Автор: , опубликовано в: WordPress, комментариев: 23
10
Фев
2011

Блокировки транзакций InnoDB при удалении данных из таблицы

Ситуация: есть несколько физических почтовых серверов (PowerMTA), отсылающих более четырёх миллионов сообщений в сутки. Есть виртуальный сервер базы данных (причём не очень мощный), на котором крутится с ; в базу данных пишутся логи доставки/не доставки сообщений и ведётся статистика по IP-адресам, VMTA и доменам. Попутно выполняется классификация и анализ hard и soft bounces. База за день увеличивается примерно на 5 гигабайт. Часть логов недельной давности удаляется. Далее »

Автор: , опубликовано в: MySQL, комментариев: 2
5
Фев
2011

WordPress: кэширование средствами nginx

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

Метод основан на использовании кэша web-сервера .

Идея состоит в генерации статических страниц и отдачи их пользователям, не имеющим cookie комментатора. Зарегистрированным пользователям, а также комментаторам всегда отдаётся свежая страница. Так как читателей, ни разу не оставлявших комментарий, как правило, гораздо больше, чем комментаторов, то подобный использование кэша позволяет значительно снизить нагрузку на /. Знакомые с принципом работы заметят, что WPSC использует тот же принцип работы. Далее »

Автор: , опубликовано в: nginx, WordPress, комментариев: 61
10
Дек
2010

WP Super Cache vs MaxSite Cache: часть 2

Вторая часть статьи WP Super Cache vs MaxSite Cache.

В предыдущей части я сравнивал поведение и на тестовом VDS (512 MiB RAM, 10 GB HD, Intel Xeon X3320 (1 ядро), 2.5 GHz), на котором ни операционная система, ни программное обеспечение не были специально настроены — бралась конфигурация «из коробки» и тестировалась. Одним словом, «VDS абсолютного чайника».

В этой части изменилась только конфигурация программного обеспечения: сервер настраивался на максимальную .

В частности:

  • отказ от Apache в пользу и от mod_5 в пользу php-fcgi (количество -процессов выбиралось таким образом, чтобы избежать использования файла подкачки);
  • смена ядра с linux-image-server на linux-image-virtual;
  • настройка : отказ от (экономит примерно 100 МБ памяти), увеличение буфера ключей и т.п.;
  • установка и настройка xCache (я исходил из того, что далеко не все чувствуют себя комфортно при сборке программ из исходников, поэтому брал только готовое ПО);
  • настройка iptables для фильтрации пакетов.

Далее »

Автор: , опубликовано в: WordPress, комментариев: 2
13
Дек
2009

Оптимизация All in One SEO Pack

Как оказалось,  — один из основных источников запросов к базе данных на блогах с большим количеством страниц (page). Всё дело в том, что в есть одна неотключаемая особенность: он пытается переписать все ссылки, которые выводятся через функцию wp_list_pages() (обычно эта функция вызывается из заголовка или подвала темы и используется для создания меню).

Вообще переписывание ссылок — это отдельная история, заслуживающая отдельной статьи. Если вкратце, то плагин берёт метаданные из поста и заменяет ими title и текст ссылки.

All in One SEO Pack: Edit Page

Что характерно, если поле Title Attribute пустое, то All in One SEO Pack вообще затрёт title ссылки.

Проблема с запросами возникает из-за того, что All in One SEO Pack читает метаданные для каждой страницы, присутствующей в результате, который вернула функция wp_list_pages(). Если в меню тридцать страниц, то в результате получим тридцать лишних запросов к базе данных. Умножаем на количество показов страниц (страниц в широком смысле, а не в терминах ) и получаем большую цифру. Далее »

Автор: , опубликовано в: Патчи, комментариев: 10
25
Ноя
2009

WP Super Cache vs HyperCache vs W3 Total Cache vs MaxSite Cache

Для написано много кэширующих плагинов, предназначенных для борьбы со слабой производительностью сервера (либо кривыми руками администратора, который не в состоянии настроить /). Простой пользователь зачастую задаётся вопросом: какой же из плагинов выбрать?

В данной статье я рассмотрю наиболее популярные плагины (, , и ), а затем расскажу о результатах жестокого теста, которому я подверг все эти плагины. Далее »

Автор: , опубликовано в: WordPress, комментариев: 53
6
Ноя
2009

PHP: красота кода сказывается на производительности: часть 2

В прошлой части:

  • if быстрее, чем switch;
  • echo быстрее, чем print;
  • явная проверка на (не)нулевое значение медленнее, чем неявная.

А также:

  • константные выражения, которые могут быть вычислены на этапе компиляции, не вычисляются;
  • не умеет удалять неиспользуемый код на этапе компиляции.

Продолжим. Далее »

Автор: , опубликовано в: PHP, комментариев: 4
7
Окт
2009

PHP: красота кода сказывается на производительности

Недавно я для себя открыл, что PHP не умеет оптимизировать код, а тут новый удар: оказывается, что красота кода отрицательно влияет на . Далее »

Автор: , опубликовано в: PHP, комментариев: 11
25
Сен
2009

SJ Hook Profiler — плагин для измерения производительности хуков

Сразу оговорюсь, что речь пойдёт совсем не о боксе, а о и .

Разработчики плагинов WordPress и bbPress используют две функции для расширения функциональности WordPress/bbPress: это add_action() и add_filter(). Первая служит для установки обработчика некоторого события, вторая — для установки фильтра. Под хуком подразумевается обобщённое понятие (либо фильтр, либо обработчик).

Как показывает практика, большая часть времени генерации страницы уходит именно на вызов обработчиков и фильтров. И когда возникает вопрос: почему время генерации страницы такое большое, а запроса всего три, и они выполняются за сотые доли секунды, на помощь приходит данный . Далее »

Автор: , опубликовано в: bbPress, Плагины WordPress, комментариев: 3
22
Сен
2009