Ajax в WordPress. Часть 3

Ajax Wordpress

AJAX в WordPress. Часть 1
AJAX в WordPress. Часть 2

Больше года назад писал о использовании ajax в WordPress. Теперь вот, хорошенько подумав, решил, что тот способ, который я назвал «неправильным», на самом деле с точки зрения производительности очень правильный)

Ранее я рекомендовал для обработки всех аякс запросов в вордпрессе цепляться к add_action( ‘wp_ajax_xxx’ ). Да, это получается строго по кодексу, другим разработчикам с вашим кодом будет очень просто разобраться, да и самим, через какое-то время все будет понятно. Для средне-статистического сайта стоит этот вариант и использовать.

В моем случае стандартное не подошло. У меня на VPS одномоментно может находиться от 5 до 30 сайтов. Хостинг замечательный. Реактивная тех.поддержка (среднее время ответа — 7 минут, обычно отвечают буквально сразу), оптимальные (для меня) тарифы, надежный (по вине хостера проблем не было).
Но периодически хостинг «радует» вот такой вот картинкой:
2013-06-30
Набегают клиенты, одновременно приходят пользователи, тут же в след заходят редакторы, кончается память и сайты потихоньку начинают отваливаться.

Помогло бы кэширование, либо замена плагинов на более быстрый аналог. Но некоторые клиенты настаивают на лично отобранных плагинах, а настраивать плагин кэширующий для сайта, висящего на хостинге 2-3 почему-то лениво.

В общем в моем случае проще было оптимизировать постоянно живущие на хостинге сайты. Полностью детально об оптимизации сайтов на вордпресс, и всех сделанных изменениях лучше позже отдельно напишу. Сейчас все же про отдельный этап — про Ajax.

Итак, создаем файл в любом месте (я буду писать, как если файл создан в корне сайта. и движок установлен так же в корень).
С вот таким содержимым. Комментарии, надеюсь достаточно понятны)

//говорим движку, что мы будем делать аякс запрос
define('DOING_AJAX', true);
 
// проверяем, есть ли переменная action. Если отправляете запрос через get, соответственно нужно поменять
// используем action для "обратной совместимости"
//вдруг мы позже решим все же использовать стандартный способ?
if (!isset( $_POST['action']))
     die('-1');
 
//"включаем" частичную загрузку движка
//для этого используем константу SHORTINIT
define('SHORTINIT', true);
 
//этот путь нужно исправить на ваш.
//если файл скрипта лежит в корне, пойдет такой
require_once('wp-load.php'); 
 
//выставляем правильные заголовки
header('Content-Type: text/html');
send_nosniff_header();
 
//или можно вот так
header('Cache-Control: no-cache');
header('Pragma: no-cache');
 
//загружаем только те функции движка, которые нам нужны.
//экономия в потреблении памяти как раз за счет загрузки только нужного нам функционала
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/post.php' );
wp_plugin_directory_constants();

Все, после этого пишем свой код, обрабатываем запрос, возвращаем результат и выходим.

Если вы отключили слишком много всего, вот тут можно посмотреть какие файлы вордпресс подключает обычно. Затем найти в каком файле лежат нужные функции и подключить их.

Стандартный аякс запрос по моим тестам отъедал 17-18 мегабайт.
2013-07-29_1350
Верхняя цифра — тестовый ответ, нижняя — к-во памяти.

Описанным тут способом получилось снизить к-во памяти до 4-5 мегабайт на запрос.
2013-07-29_1352

Меньше памяти — экономия ресурсов, больше сайтов на одном хостинге)
Хоть на графике статистики потребления памяти явного снижения и не заметно, но эффект есть — одновременно с оптимизацией поднял еще пару сайтов. До оптимизации хостинг еще и эти сайты не вмещал.

Метки: ,
Автор: dimas