Ajax занимает в 10 раз больше времени, чем нужно

50

Я только что натолкнулся на свою первую серьезную проблему с WordPress, и для тех, кто любит Ajax, это большая проблема.

У меня есть запрос Ajax, который занимает 1,5 секунды при использовании Ajax API.

Если я беру тот же самый точный код и запускаю его с помощью специального скрипта (без WordPress), запрос Ajax занимает всего 150 миллисекунд. Это не преувеличение

Если вы посмотрите на самый первый комментарий http://wp.smashingmagazine.com/2011/10/18/how-to-use-ajax-in-wordpress/ и в последующем разговоре вы увидите, что эта медлительность вызвана по тому, что по вашему запросу загружается весь WP ...

Я надеюсь, что есть решение, которое позволит делать запросы Ajax, не загружая весь WordPress.

Каков ваш опыт ускорения запросов Ajax с помощью WordPress?

Майк
источник
3
Интересно, могут ли популярные плагины для кэширования охватить эту ситуацию?
Рафаэль
@ Рафаэль, я тоже об этом думал, но не видел упоминаний об этом. Это было бы здорово, если бы они это сделали
Майк

Ответы:

57

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

Мне нужна была намного лучшая производительность (для очень динамической функции инкрементального поиска) для работы, и я выбрал следующее:

  1. Пользовательский файл в качестве обработчика Ajax.
  2. Константа SHORTINIT для ограниченной загрузки ядра WP.
  3. Очень избирательно загружаются части ядра, только те, которые необходимы для выполнения задачи.

Это обеспечивает очень ограниченную среду, но производительность намного выше, и разумная степень совместимости с WP (начиная с $wpdb) сохраняется.

Вот стартовый файл моего загрузчика, не очень, но работает для конкретных нужд:

<?php

ini_set('html_errors', 0);
define('SHORTINIT', true);

require '../../../../wp-load.php';
require( ABSPATH . WPINC . '/formatting.php' );
require( ABSPATH . WPINC . '/meta.php' );
require( ABSPATH . WPINC . '/post.php' );
wp_plugin_directory_constants();

// stuff goes here
Rarst
источник
1
Что вы имеете в виду под словом SHORTINIT? Можете ли вы привести примеры? Я предполагаю, что мне нужно будет настроить свои собственные обработчики с разной степенью загрузки WP в зависимости от необходимости запроса, но я хотел бы увидеть некоторые примеры, которые вы создали.
Майк
6
@ Майк, он не так широко известен, но по-настоящему прост по концепции - если SHORTINITзадана константа, WP не будет загружать большую часть ядра (без большинства API / функций, без плагинов, без темы). Я добавлю код, чтобы ответить.
Первое
1
Это выглядит хорошо. Мне просто не нравится тот факт, что мы должны использовать require '../../../../wp-load.php'; это делает это довольно обычай. Я также беспокоюсь о том, как легко получить ресурсы, которые вам «нужны», поскольку мой опыт работы с WordPress не очень модульный.
Майк
@ Правильно, но даже с проблемами это намного лучше, чем конечная точка, которая вообще не имеет никакого представления о WP. Это можно (и нужно) улучшить еще немного, но сейчас это не является для меня актуальной задачей.
Rarst
Существуют ли какие-либо методы определения местоположения wp-load.php из WordPress? Например, могу ли я написать статический файл с путем, заданным в качестве переменной, при загрузке плагина, а затем включить этот файл в отдельный файл ответов Ajax?
hereswhatidid
0

Я нашел это, и это ускорило мой аякс.

function my_deregister_heartbeat() {
    global $pagenow;

    if ( 'post.php' != $pagenow && 'post-new.php' != $pagenow ) {
         wp_deregister_script('heartbeat');
         wp_register_script('heartbeat', false);
     }
}
add_action( 'admin_enqueue_scripts', 'my_deregister_heartbeat' );
Лиза Даугерти Томпсон
источник