Мне нужно запустить фоновый процесс в плагине, который выполняет некоторую работу со ВСЕМИ сообщениями в базе данных человека после установки плагина. Я очень новичок в работе с wordpress, поэтому мои исследования показали, что я могу использовать запрос wp или я могу использовать «цикл».
Поскольку я просматриваю абсолютно каждый пост, скорость имеет существенное значение. Мне нужно проверить заголовок, тело, категории, метатеги, состояние публикации и защиту паролем. Итак, исходя из этого, какой из них будет самым быстрым?
«Цикл» — это просто имя, данное
while (have_posts()): the_post();
циклу, используемому для перебора массива сообщений, возвращаемыхWP_Query()
. Другая функция, используемая для запроса сообщений, — это функция get_posts(), которая возвращает простой (нерасширенный) массив, который вы можете пройти с помощьюforeach
цикла.Я не думаю, что это имеет большое значение; однако, если вы придираетесь, этот
get_posts()
метод немного быстрее и менее требователен к памяти, поскольку он не вызываетсяsetup_postdata()
(который заполняет теги шаблона и т. д.) для каждого сообщения, через которое он проходит.В любом случае, вам, вероятно, не хватит памяти на некоторых настройках с тысячами постов… В этом случае убедитесь, что вы создали запасные варианты.
ааа… как я могу явно освободить память после завершения данного поста?
Глядя на API кодекса, кажется, что есть «смещение» и «номерные сообщения». Я могу использовать это, чтобы пройти только 100 за раз, верно? Если да, то это решит проблему с памятью за счет сборки мусора? Или что-то кешируется в памяти :/?
Честно говоря, я не совсем уверен. Снимите все локальные переменные, которые вы используете, прежде чем переходить к следующему сообщению. Звоните
ini_set('max_execution_time', $somehugenumber);
перед началом. И включите какой-нибудь индикатор прогресса, чтобы препятствовать прерыванию пользователя. Или разбейте свою задачу на куски и запустите ее как запланированные события cron.Да, вы можете использовать «смещение», чтобы просматривать сообщения частями разумного размера. Таким образом, вы только извлекаете в память массив указанного размера. Массив get_posts возвращает все столбцы в
wp_posts
таблице, поэтому обращениеget_posts('numberposts=-1')
к сайту с 10 000 сообщений загружает в память массив, включающий полное содержимое всех 10 000 сообщений. Вот бы проблема с памятью…@Thirlan: Многие функции, которые что-то делают с сообщением, будут вызывать
get_post()
, что добавит сообщение в кеш. Таким образом, даже если вы выполняете несколько запросов к базе данных для одного HTTP-запроса, не вся память будет восстановлена. Я рекомендую вам делать это с несколькими запросами (через Ajax, с полосой прогресса для обратной связи?), где каждый запрос обрабатывает несколько сообщений.«Цикл» — это просто имя, применяемое к циклу foreach, применяемому к объекту WP_Query. Так что вам нужны оба. Обычно цикл также включает the_post(), так что вы можете использовать теги шаблона.
Хотя есть и другой вариант, который может быть быстрее. В зависимости от того, что вам нужно сделать, вы можете сделать прямой запрос к базе данных, чтобы получить только те поля, которые вы хотите отредактировать. Но поскольку вам также нужны категории и метатеги, это будет сложное соединение. Для упрощения обновлений и обратной совместимости вы также можете использовать обычный файл WP_Query.