Home > Системы управления содержимым (CMS) > WordPress > Улучшения WordPress > Ускорение блога на WordPress

Ускорение блога на WordPress

Подавляющее большинство пользователей, кто прослеживал эволюцию вордпресс от ранних версий до примерно 2.5 и далее, обратил внимание на то, что каждая новая версия становилась всё более прожорливой и медленной. Третья линейка не является исключением. В этой статье я расскажу об ускорении сайта на вордпресс 3.х.х версии.1. Прежде чем говорить о како-то ускорении, нужно получить объективные данные о текущей нагрузке, то есть необходимо снять исходные показания нагрузки блога на сервер. Для этого:
в functions.php прописать:

<?php function usage() {
printf(('%d / %s'), get_num_queries(), timer_stop(0, 3));
if ( function_exists('memory_get_usage') ) echo ' / '
. round(memory_get_usage()/1024/1024, 2) . 'mb ';
}
add_action('admin_footer_text', 'usage'); ?>

в footer.php:

<small><?php usage(); ?></small>

Нам это даст такие показания: количество запросов к базе данных/время генерации страницы в секундах/потреблённая при генерации страницы память.
Например, вот такого вида:

100 / 3,584 / 16.32mb.

2. Ни в коем случае не слушаем «умных рекомендаций» и не устанавливаем плагин Pure PHP Localization!!! Несмотря на то, что он снижает расход памяти примерно на 6 мегабайт, он может внезапно дать огромную нагрузку на процессор! В эксперименте он чуть было не положил VDS.

3. Управление ревизиями постов. Это позволяет сократить объём базы данных, в зависимости от настроек. Нам нужен файл wp-config.php.
- Для полного отключения ревизий постов вордпресс добавим строку:

define('WP_POST_REVISIONS', false);

- Можно ревизии не отключать вовсе, а огранить их количество таким образом:  добавим в файл конфигурации вордпресса такую вот строку:

define('WP_POST_REVISIONS', 2);

Где 2 — максимально возможное количество ревизий записи. Установить можно по своему усмотрению.
- В вордпрессе можно изменить интервал автосохранения для записей. В конфигурационный файл добавить строки:

define( 'AUTOSAVE_INTERVAL', 60 );
define('WP_POST_REVISIONS', 1);

Где — 60 — интервал автосохранения в секундах, 1 — максимально допустимое число ревизий постов.

4. Оптимизация темы сайта. Прежде всего — header.php. Задача: избавиться от лишних запросов к базе данных.

<meta http-equiv="Content-Type" content="<?php bloginfo('html_type'); ?>; charset=<?php bloginfo('charset'); ?>" />

заменить на

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

Снимаем показания:

97 / 3,108 / 10.6mb.

Также есть смысл заменить ссылки на стили.

<link rel="stylesheet" href="<?php bloginfo('stylesheet_url'); ?>" type="text/css" media="screen" />

заменить на

<link rel="stylesheet" href="/wp-content/themes/theme/style.css" type="text/css" media="screen" />

Возможно, в Вашей теме есть стиль и для эксплорера. Не обходите его стороной!

Заменяем ссылку на пингбеки:

<link rel="pingback" href="<?php bloginfo('pingback_url'); ?>" />

заменить на

<link href="/xmlrpc.php" rel="pingback"/>

Заменяем ссылку на RSS фид.

<link rel="alternate" type="application/rss+xml" title="<?php bloginfo('name'); ?> RSS 2.0 Feed" href="<?php bloginfo('rss2_url'); ?>" />

заменить на

<link rel="alternate" type="application/rss+xml" title="Блог экспериментатора RSS 2.0 Feed" href="/feed/" />

Удаляем:

<link rel="alternate" type="text/xml" title="<?php bloginfo('name'); ?> RSS Feed" href="<?php bloginfo('rss_url'); ?>" />
<link rel="alternate" type="application/atom+xml" title="<?php bloginfo('name'); ?> Atom 0.3" href="<?php bloginfo('atom_url'); ?>" />

Меняем путь до иконки:
<link rel=»Shortcut Icon» href=»<?php bloginfo(‘template_directory’); ?>/img/favicon.ico» type=»image/x-icon» />

<link rel=»Shortcut Icon» href=»/wp-content/themes/theme/img/favicon.ico» type=»image/x-icon» />

Так же можно удалить излишние мета-теги сайта из wp_head, вставив следующий код в файл функций (functions.php) вашей темы.

<?php
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
remove_action( 'wp_head', 'wp_generator' );
?>

Вообще, вот кусок кода, который должен оказаться в functions.php после оптимизации:

<?php
add_filter( 'pre_site_transient_update_core', create_function( '$a', "return null;"));
add_filter( 'pre_site_transient_update_plugins', create_function( '$a', "return null;" ) );
add_filter( 'pre_site_transient_update_themes', create_function( '$a', "return null;" ) );
add_filter( 'pre_transient_update_core', create_function( '$a', "return null;"));
add_filter( 'pre_transient_update_plugins', create_function( '$a', "return null;" ) );
add_filter( 'pre_transient_update_themes', create_function( '$a', "return null;" ) );
add_filter('pre_site_transient_update_core',create_function('$a', "return null;"));
add_filter('pre_site_transient_update_themes',create_function('$a', "return null;"));
remove_action( 'admin_init', '_maybe_update_core' );
remove_action( 'admin_init', '_maybe_update_plugins' );
remove_action( 'admin_init', '_maybe_update_themes' );
remove_action( 'load-plugins.php', 'wp_update_plugins' );
remove_action( 'load-themes.php', 'wp_update_themes' );
remove_action( 'load-update.php', 'wp_update_plugins' );
remove_action( 'load-update.php', 'wp_update_themes' );
remove_action( 'load-update-core.php', 'wp_update_plugins' );
remove_action( 'load-update-core.php', 'wp_update_themes' );
remove_action( 'wp_head', 'adjacent_posts_rel_link', 10, 0 );
remove_action( 'wp_head', 'feed_links', 2 );
remove_action( 'wp_head', 'feed_links_extra', 3 );
remove_action( 'wp_head', 'index_rel_link' );
remove_action( 'wp_head', 'parent_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'rsd_link' );
remove_action( 'wp_head', 'start_post_rel_link', 10, 0 );
remove_action( 'wp_head', 'wlwmanifest_link' );
remove_action( 'wp_head', 'wp_generator' );
remove_action( 'wp_update_plugins', 'wp_update_plugins' );
remove_action( 'wp_update_themes', 'wp_update_themes' );
remove_action( 'wp_version_check', 'wp_version_check' );
remove_action('load-update-core.php','wp_update_themes');
wp_clear_scheduled_hook( 'wp_update_plugins' );
wp_clear_scheduled_hook( 'wp_update_themes' );
wp_clear_scheduled_hook( 'wp_version_check' );
wp_clear_scheduled_hook('wp_update_themes');
wp_clear_scheduled_hook('wp_version_check');
?>

Обратите внимание на то, что в footer.php также могут встретиться лишние запросы к MySQL, типа:

<a href="<?php echo get_settings('home'); ?>"><?php bloginfo('name'); ?></a>

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

<a href="/">Блог экспериментатора</a>

Настоятельно рекомендую тщательнейшим образом просмотреть ВСЕ .php-файлы используемой темы, так как в них могут быть излишние запросы.
Больше всего, конечно, этим грешит header.php.
Также в темах необходимо удалить все комментарии типа <!–код –> и /*код*/.

Можно использовать дополнительную компрессию страниц с помощью zlib. Узнать о наличии zlib можно либо через панель управления хостингом, либо создав файл типа phpinfo.php с содержимым:

<?php phpinfo(); ?>

Запускаем этот файл в браузере и ищем zlib. Если его нет, то можно попросить хостера включить его. На vds это сделать существенно проще: никого не нужно просить — всё доступно без посторонней помощи :)
Если с zlib всё в порядке, то в header.php, в самом начале файла, прописываем:

<?php
ini_set('zlib.output_compression', 'On');
ini_set('zlib.output_compression_level', '1');
?>

Кроме того, в header.php можно сразу после

</head>

вставить код:

<?php flush(); ?>

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

5. Отключаем лишние виджеты. Иногда диву даёшься, сколько ненужных виджетов вешают вебмастера на сайты. Конечно же, увеличивая нагрузку на сервер, да ещё и снижая юзабилити сайта. Даже при наличии кеширующих плагинов, как правило, кеширование не применяется для зарегистрированных и авторизованных пользователей, что снижает удобство использования сайта.
Вот пример виджетов, которые как бы не нужны совсем:
Свежие записи — зачем, их и так видно. Если, конечно, в качестве главной страницы не выводится статическая страница.
Свежие комментарии — Вы правда думаете, что кто-то из случайно зашедших пользователей их будет читать? А администратору блога они прекрасно в консоли видны.
Архивы — поисковик сам дойдёт до этих страниц. А пользователи — найдут через поиск, карту сайта, в категориях. А наиболее вероятно, придут из поисковой системы, прочитают интересующую страницу и уйдут.
Календарь — может, для женщин и удобно… Но зачем создавать лишние запросы к базе данных :) ?

6. Удаляем ненужные плагины. К сожалению, очень многие плагины для WordPress плохо оптимизированы и создают излишнюю нагрузку на сервер, при это не выполняя никаких действительно полезных функций. К примеру, плагины, выводящие похожие посты. В моём примере один из таких плагинов создавал четверть всей нагрузки на сервер! Больше, чем само ядро вордпресса! При это я ни разу не видел плагинов, которые выводят по-настоящему похожие, связанные записи с текущей записью. Из этого можно сделать вывод, что такие плагины годятся только для перелинковки некачественных сайтов, сделанных для роботов. Для людей гораздо лучше вручную перелинковать статьи, тогда ссылки будут действительно релевантны и естественны.

7. Уменьшаем количество записей, выводимых на главную страницу. Зачем нам 10 штук — пяти вполне достаточно. К тому же, для ботов будет создаваться впечатление, что страница обновляется чаще :)

8. Устанавливаем плагин для кеширования. Лучше всего в этом деле себя зарекомендовал WP Super Cache. Последние версии особенно хороши, так как позволяют создать полную статическую копию сайта и выдавать её поисковым системам, таким образом, практически не нагружая сервер при заходе поисковых ботов. Даже если не включать кеширующий плагин для зарегистрированных гостей на блоге, активно посещаемом поисковыми пауками, прирост производительности всё-таки ощущается.

После этих несложных шагов замеряем показания:

56 / 0,356 / 12.29mb

И исходные данные:

100 / 3,584 / 16.32mb.

Впечатляет, не правда ли? ;)

+1
-1
  

22.08.2012 · Алексей · 4 комментария Просмотров: 566
Метки:  · Рубрики: Улучшения WordPress

4 комментария

  1. Надежда - 23.08.2012

    Проще установить сразу WP Super Cache и не мучиться, всё остальное — экономия на спичках.

    Like or Dislike: Thumb up 1 Thumb down 0

  2. Алексей Алексей - 23.08.2012

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

    Like or Dislike: Thumb up 0 Thumb down 0

  3. Евгений - 29.08.2012

    Хорошо написано, но это известно всем, кто делает сайты на вордпрессе!

    Like or Dislike: Thumb up 0 Thumb down 0

  4. Алексей Алексей - 29.08.2012

    Но есть те, кто только собирается начать их делать. Статья ориентирована как раз на этих читателей.

    Like or Dislike: Thumb up 0 Thumb down 0