AJAX в WordPress. Часть 1
AJAX в WordPress. Часть 2
Больше года назад писал о использовании ajax в WordPress. Теперь вот, хорошенько подумав, решил, что тот способ, который я назвал «неправильным», на самом деле с точки зрения производительности очень правильный)
Ранее я рекомендовал для обработки всех аякс запросов в вордпрессе цепляться к add_action( ‘wp_ajax_xxx’ ). Да, это получается строго по кодексу, другим разработчикам с вашим кодом будет очень просто разобраться, да и самим, через какое-то время все будет понятно. Для средне-статистического сайта стоит этот вариант и использовать.
В моем случае стандартное не подошло. У меня на VPS одномоментно может находиться от 5 до 30 сайтов. Хостинг замечательный. Реактивная тех.поддержка (среднее время ответа — 7 минут, обычно отвечают буквально сразу), оптимальные (для меня) тарифы, надежный (по вине хостера проблем не было).
Но периодически хостинг «радует» вот такой вот картинкой:
Набегают клиенты, одновременно приходят пользователи, тут же в след заходят редакторы, кончается память и сайты потихоньку начинают отваливаться.
Помогло бы кэширование, либо замена плагинов на более быстрый аналог. Но некоторые клиенты настаивают на лично отобранных плагинах, а настраивать плагин кэширующий для сайта, висящего на хостинге 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 мегабайт.
Верхняя цифра — тестовый ответ, нижняя — к-во памяти.
Описанным тут способом получилось снизить к-во памяти до 4-5 мегабайт на запрос.
Меньше памяти — экономия ресурсов, больше сайтов на одном хостинге)
Хоть на графике статистики потребления памяти явного снижения и не заметно, но эффект есть — одновременно с оптимизацией поднял еще пару сайтов. До оптимизации хостинг еще и эти сайты не вмещал.