SJ Hook Profiler
В погоне за микросекундами
Разработчики плагинов WordPress и bbPress используют две функции для расширения функциональности WordPress/bbPress: это add_action() и add_filter(). Первая служит для установки обработчика некоторого события, вторая — для установки фильтра. Под хуком подразумевается обобщённое понятие (либо фильтр, либо обработчик).
Как показывает практика, большая часть времени генерации страницы уходит именно на вызов обработчиков и фильтров. И когда возникает вопрос: почему время генерации страницы такое большое, а запроса всего три, и они выполняются за сотые доли секунды, на помощь приходит данный плагин.
В отличие от WP Tuner, которому явно нужно указывать, какие события нужно профилировать, SJ Hook Profiler автоматически определяет все используемые хуки и устанавливает обработчики, измеряющие их время работы. На выходе получается что-то вида данной таблицы:
| Hook Name | Total Time | Invocations | Average Time |
|---|---|---|---|
| pre_option_gmt_offset | 0.000169 | 1 | 0.000169 |
| option_blog_charset | 0.000405 | 11 | 0.000037 |
| plugins_loaded | 0.014295 | 1 | 0.014295 |
| option_siteurl | 0.000810 | 26 | 0.000031 |
| option_home | 0.004852 | 160 | 0.000030 |
| sanitize_comment_cookies | 0.000117 | 1 | 0.000117 |
| option_category_base | 0.000029 | 1 | 0.000029 |
| option_tag_base | 0.000027 | 1 | 0.000027 |
| setup_theme | 0.000030 | 1 | 0.000030 |
| wp_default_scripts | 0.001951 | 1 | 0.001951 |
| set_current_user | 0.000114 | 1 | 0.000114 |
| init | 0.011603 | 1 | 0.011603 |
| widgets_init | 0.003384 | 1 | 0.003384 |
| wp_default_styles | 0.000349 | 1 | 0.000349 |
| query_vars | 0.000036 | 1 | 0.000036 |
| sanitize_title | 0.001518 | 17 | 0.000089 |
| posts_where | 0.000033 | 1 | 0.000033 |
| the_posts | 0.000127 | 1 | 0.000127 |
| template_redirect | 0.000541 | 1 | 0.000541 |
| bloginfo | 0.002297 | 8 | 0.000287 |
| term_name | 0.000621 | 2 | 0.000310 |
| term_description | 0.000982 | 2 | 0.000491 |
| single_post_title | 0.000468 | 2 | 0.000234 |
| wp_title | 0.000747 | 2 | 0.000373 |
| wp_head | 0.020773 | 1 | 0.020773 |
| comments_open | 0.000373 | 4 | 0.000093 |
| the_title | 0.011747 | 46 | 0.000255 |
| wp_print_styles | 0.000175 | 2 | 0.000088 |
| style_loader_src | 0.000330 | 9 | 0.000037 |
| wp_print_scripts | 0.000440 | 1 | 0.000440 |
| print_scripts_array | 0.000050 | 1 | 0.000050 |
| wp_list_pages | 0.000305 | 1 | 0.000305 |
| the_author | 0.000534 | 2 | 0.000267 |
| the_content | 1.004469 | 1 | 1.004469 |
| comment_text | 0.001105 | 1 | 0.001105 |
| pings_open | 0.000087 | 1 | 0.000087 |
| comment_form | 0.007084 | 1 | 0.007084 |
| widget_title | 0.001137 | 4 | 0.000284 |
| list_cats | 0.004768 | 22 | 0.000217 |
| wp_footer | 0.009798 | 1 | 0.009798 |
| wp_print_footer_scripts | 0.000115 | 1 | 0.000115 |
Из таблицы видно, что слабое место — это вызов фильтра the_content (вызов более одной секунды), и копать нужно именно в сторону оптимизации фильтров the_content. Пока не поддерживается профилирование каждого обработчика (то есть делаются замеры до вызова первого обработчика the_content и после вызова последнего), но это в планах.
Особенность плагина — поддержка как WordPress, так и bbPress.
По умолчанию плагин активен только для администратора (WordPress) и Key Master (bbPress); изменить это можно, повесив обработчик на фильтр enable_hook_profiler (должен вернуть true, если профайлер нужно активировать и false в противном случае).
История изменений:
- Версия 0.1:
- Версия 0.2:
- Исправлена ошибка, приводящая к выдачи предупреждения
PHP Warning: Missing argument 1 for SjProfiler::end_profile() in /wp-content/plugins/sj-hook-profiler/lib/class.Profiler.php on line 74; - Ускорение производительности благодаря оптимизации кода.
- Исправлена ошибка, приводящая к выдачи предупреждения
- Версия 0.2.1:
- Добавлена поддержка WordPress 2.7.x (возможно, и более ранних версий).
Домашняя страница плагина на wordpress.org.
Внимание: плагин написан на PHP 5, PHP 4 не поддерживается принципиально.


Меня зовут Владимир, я программист-фрилансер, специализирующийся на Web-программировании и програмировании под Linux.
По совместительству занимаюсь администрированием LAMP/LNMP-серверов и техническим переводом.






Плагин ругается:
Fatal error: Call to undefined function esc_attr() in /var/www/bagrincev.ru/wp-content/plugins/sj-hook-profiler/sj-hook-profiler.php on line 89
И не работает =(
Он писался для WordPress 2.8
Попробуйте заменить
esc_attr()наwp_specialchars()Сработало, спасибо!
Забыл указать версию Wordpress: 2.7
Обновил плагин до 0.2.1 — добавил поддержку WP 2.7.x