Оптимизация блога: уменьшите количество запросов к базе данных

Содержание серии Оптимизация WordPress блога

  1. Компрессия или кэш?

Оптимизация блогов WordPressЕсли вы не забыли, мы все еще оптимизируем блоги. Уменьшаем картинки, повышаем производительность, включаем компрессию и всякие другие полезные советы.

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

И так, все кто уже хорошо познакомился с движком для блогов WordPress, должны знать, что он работает на связке PHP+MySQL. PHP у нас занимается генерацией динамических страниц, а MySQL у нас обслуживает базу данных, в которой находятся все ваши посты, комментарии, настройки блога, настройки плагинов и еще много всякого.

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

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

В вашем шаблоне, как правило это файл header.php или простыми словами «Заголовок» присутствуют следующие строчки:

  1. <title><?php bloginfo(’name’); ?><?php bloginfo(’description’); ?></title>
  2. <meta http-equiv="Content-Type" content="<?php bloginfo(’html_type’); ?>; charset=<?php bloginfo(’charset’); ?>” />
  3. <meta name="generator" content="WordPress <?php bloginfo(’version’); ?>” />
  4. <link rel="stylesheet" href="<?php bloginfo(’stylesheet_url’); ?>” type=”text/css” media=”screen” />
  5. <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="<?php bloginfo(’rss2_url’); ?>” />

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

  1. Например первая строка выводит название и описание вашего блога, ее можно заменить на статическую надпись типа:<title>Блог про блоги от Дмитрия Донченко</title>Но если у вас установлен какой либо плагин, который динамически меняет заголовки страницы, то тогда работать он перестанет. Поэтому первую строчку рекомендую не менять.
  2. Вторая строка выводит кодировку блога и тип содержимого блога, как правило для всех блогов эта строка одинакова и ее можно заменить статической строчкой вида:<meta http-equiv="Content-Type" content="text/html; charset=UTF-8” />
  3. Третья строка выводит версию вашего WordPress, не думаю что это очень важная информация, поэтому можно либо вообще удалить ее, либо прописать ручками что-то типа:<meta name="generator" content="WordPress 2.3” />
  4. Четвертая строка, использует переменную, в которой задан путь к файлу CSS для шаблона вашего блога, ее можно заменить на вот такую (важно правильно прописать путь к файлу CSS):<link rel="stylesheet" href="http://blogproblog.com/wp-content/themes/default/style.css” type=”text/css” media=”screen” />
  5. Строка номер 5 путь к вашей RSS ленте, в шаблоне может быть несколько упоминаний этой переменной (<?php bloginfo(’rss2_url’); ?>) ее можно заменить ссылкой на вашу RSS ленту, есть два варианта:<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://feeds.feedburner.com/bpb” />
    <link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="http://blogproblog.com/feed/” />

Вот собственно и все, фактически данные изменения позволяют избавиться от 5 лишних запросов к вашей базе данных, если учитывать что ссылка на RSS упоминается в шаблоне несколько раз, то возможно даже больше чем от пяти.
Martial Arts Humor спонсор поста сегодня.

Комментарии: 16Напишите свой комментарий!

  1. Денис Судилковский Написал(а):

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

  2. Tod Написал(а):

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

  3. Денис Судилковский Написал(а):

    Tod,
    Ну я ж не говорил, что постоянно 1к посетителей (;
    Вылазишь случаем где-то на первую страничку чего-то популярного, и бац — штука уников за 3-4 часа легко налетает. А сервак то не резиновый, трищит по швам от напряга. Вот что бы не было таких «форс мажоров» во время «джек пота», и следует заранее готовиться (:

  4. Dmitriy Donchenko Написал(а):

    Кстати в случае digg-эффекта, я думаю не нужно никому объяснять что это такое, самое правильное действие это включить правильный режим в плагине WP-Super-Cache, который называется Lock Down.

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

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

  5. Tod Написал(а):

    При дигг-эффекте, думаю, это тоже не поможет:) Хотя плагин хорошо, без сомнения.
    А про тыщу уников то я так шутя говорил:)

  6. Dmitriy Donchenko Написал(а):

    А вот курсанты Сергея Жуковского, с тысячей уников не шутят, они к ней стремятся.

  7. Евгений Написал(а):

    Как программист, я бы посоветовал изменять функцию get_bloginfo(…), которая вызывается из bloginfo(…) (файл wp-includes/general-template.php). Здесь можно за 1-2 запроса, плюс немного грубого кода получить все опции, которые там получают и засунуть их в static переменную (она будет хеш таблицей). Проверяем, если эта переменная не пустая, то возвращаем нужное значение, если пустая, то делаем эти пару запросов и инициализируем эту переменную.

    Вот так вот я бы сказал и если бы не пользовался все время своими скриптами, а вордпресом, непример, то еще бы и написал, как это должно быть в пхп коде :)

  8. oldvovk Написал(а):

    href=»http://blogproblog.com/wp-content/themes/default/style.css”

    не обязательную часть можно и убрать, оставив

    href=»/wp-content/themes/default/style.css”

  9. ezoterik Написал(а):

    Спасибо! Было бы интересно увидеть еще продолжение серии про оптимизацию блога на уровне MySQL, Apache и PHP.

  10. Ночной Кошмар Написал(а):

    Многие блоги на WP отправляют порядка 20-30 запросов к базе. Те, кто пользуются плагинами для составления карты сайта(которая для людей а не для гугла) имеют порядка сотни запросов. Некоторые портальные темы для WP генерируют 40-60 запросов. А есть какое-то оптимальное количество запросов к базе? Просто нашел как раз тему симпатичную, но при ее установке получаем 46 запросов… По моему многовато. Или можно не беспокоиться? Спасает ли в таких случаях плагин для кеширования?

  11. Антон Написал(а):

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

  12. Ирина Написал(а):

    Я совсем не программист, а на Вашем блоге все доходчиво объясняется.

  13. Владислав Написал(а):

    Хм…ну что же сказать насчёт этой статьи…заголовок конечно правильный, только вот содержание выдаёт в авторе человека которые не знает архитектуру wp (без обид). Например вот
    1.
    2. <meta http-equiv=»Content-Type» content=»; charset=” />
    3. <meta name=»generator» content=»WordPress ” />
    4. <link rel=»stylesheet» href=»” type=”text/css” media=”screen” />
    5. <link rel=»alternate» type=»application/rss+xml» title=»RSS 2.0″ href=»” />

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

  14. Dmitriy Donchenko Написал(а):

    Владислав, Вы ведь не станете спорить, что заменив функции по данному руководству, на статические строки, Вы уменьшите нагрузку на сервер?

    И интересно что это за запрос такой? Можете описать подробнее для неграмотных?

  15. Владислав Написал(а):

    Замена функции на статику, теоретически, сможет разгрузить сервер, но нагрузка уменьшится на сотые доли процента — это как капля в море ))) Это тоже самое что использовать echo вместо print, так как echo выполняется на 0,00002 секунды быстрее ))

    Вот и функция которая управляет массивом опций (functions.php 470):

    function wp_load_alloptions() {

    if ( !$alloptions_db = $wpdb->get_results( «SELECT option_name, option_value FROM $wpdb->options WHERE autoload = ‘yes'» ) )
    // ГЛАВНЫЙ ЗАПРОС КОТОРЫЙ ЗАБИРАЕТ ОПЦИИ ИЗ БАЗЫ ДАННЫХ

    $alloptions = array();
    foreach ( (array) $alloptions_db as $o )
    $alloptions[$o->option_name] = $o->option_value;

    wp_cache_add( ‘alloptions’, $alloptions, ‘options’ );
    // ОПЦИИ ПОМЕЩАЮТСЯ В КЭШ
    }
    return $alloptions;
    }

    Теперь когда все опции в кэше, вызываем скажем функцию bloginfo(’description’) она вызывает функцию get_option (‘description’), которая в свою очередь содержит кэш-функцию wp_cache_get( $setting, ‘options’ ) где $setting = ‘description’. Функция заходит в кеш (который есть просто многомерный массив), получает доступ к элементу ‘options’ котрый тоже является массивом который содержит все опции (description, stylesheet_url, version, site_url etc.) и выбирает оттуда значение ключа description, который в конечном итоге отображается на странице. Другими словами данные из БД запрошены при инициализации движкка, ещё ДО того как вы их запросите их посредством функций упомянутых в вашем посте, поэтому написав хоть миллион раз bloginfo(’название опции’) вы будете получать каждый раз данные из кеша, не затронув при этом базу данных.

    Так-то ))

  16. Dmitriy Donchenko Написал(а):

    Великолепно, Владислав! Огромное спасибо.

1 Ссылки на эту запись

  1. Дизайн или контент? (bizdesign edition) : Бизнес Дизайн Написал(а):

    […] что интересного есть в интеренете? Качественная оптимизация блога, Копирайтер о копирайтинге, про женские дезики, и […]

Оставьте комментарий Ваш шанс быть услышанным!