Почему в WP ошибка Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 33554440 bytes)?
При получении записей - вылазит вот эта ошибка
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 33554440 bytes) |
Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 33554440 bytes)
Что за ошибка - я понимаю, и могу попытаться конечно увеличить обьем, но предполагаю, что не поможет и вновь появится через время, т.к. записей будет становиться больше. Сейчас их под 500 всего(без фильтров).
Получаю я записи таким образом -
$args = array( 'post_type' => 'turnir', 'posts_per_page' => 10, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'Участник', 'value' => $nameM, 'compare' => '=', ) ), 'orderby' => 'date', // Сортировать по дате 'order' => 'ASC' // В порядке возрастания ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ($query->have_posts()) { $dataTurnir = get_post_meta( get_the_ID(), 'Дата турнира', true ); $level = get_post_meta( get_the_ID(), 'Класс_М', true ); $nameTurnir = get_post_meta( get_the_ID(), 'Название турнира', true ); $okr = get_post_meta( get_the_ID(), 'ОКР', true ); $result[] = [ 'Дата' => $dataTurnir, 'Ступень' => $level, 'Название' => $nameTurnir, 'Балл' => $okr, ]; } } |
$args = array( 'post_type' => 'turnir', 'posts_per_page' => 10, 'meta_query' => array( 'relation' => 'AND', array( 'key' => 'Участник', 'value' => $nameM, 'compare' => '=', ) ), 'orderby' => 'date', // Сортировать по дате 'order' => 'ASC' // В порядке возрастания ); $query = new WP_Query( $args ); if ( $query->have_posts() ) { while ($query->have_posts()) { $dataTurnir = get_post_meta( get_the_ID(), 'Дата турнира', true ); $level = get_post_meta( get_the_ID(), 'Класс_М', true ); $nameTurnir = get_post_meta( get_the_ID(), 'Название турнира', true ); $okr = get_post_meta( get_the_ID(), 'ОКР', true ); $result[] = [ 'Дата' => $dataTurnir, 'Ступень' => $level, 'Название' => $nameTurnir, 'Балл' => $okr, ]; } }
записей всех около 500, но с текущими фильтрами которые я указал - там от силы ну 10 получится, почему тогда вылазит эта ошибка? Может как-то по другому стоит получать записи?
Дополнительные вопросы
Есть предположение, что текущей памяти вообще овер мало, как я понял у меня 25мб, а для скрипта нужно 256мб
Имеешь ввиду попробовать так? Если да, то не помогло
if ( $query->have_posts() ) { while ($query->have_posts()) { $dataTurnir = get_post_meta( get_the_ID(), '', true ); $result[] = [ 'Дата' => $dataTurnir, ]; } } |
if ( $query->have_posts() ) { while ($query->have_posts()) { $dataTurnir = get_post_meta( get_the_ID(), '', true ); $result[] = [ 'Дата' => $dataTurnir, ]; } }
будет
$dataTurnir['Дата турнира']
как я понял у меня 25мб, а для скрипта нужно 256мб
Ровно наоборот - у вас лимит в 256 мб, скрипту не хватило ещё как минимум 32 мб.
alexalexes @alexalexes
while ($query->have_posts()) // вероятно, это всегда true { $result[] = [ // тут мы без конца наполняем массив - получаем переполнение памяти ]; } |
while ($query->have_posts()) // вероятно, это всегда true { $result[] = [ // тут мы без конца наполняем массив - получаем переполнение памяти ]; }
pantsarny @pantsarny Не грузите посты целиком , а только id
fields ids
- И используйте get_posts и не делайте глобальный пост
- Ну и еще вы же абыли the_post, пост из запроса не берется и у вас получается бесконечный цикл
Ответы на вопрос 0
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Ошибка
Allowed memory size exhaustedозначает, что PHP-скрипт съел весь доступный лимит памяти. Если записей всего около 500, проблема обычно не в количестве как таковом, а в том, что запрос забирает слишком много данных или потом тяжело обрабатывает их в PHP.Типичные причины:
posts_per_page => -1и загрузка всех записей сразу;Если нужны только ID:
$query = new WP_Query([ 'post_type' => 'post', 'posts_per_page' => 100, 'fields' => 'ids', 'no_found_rows' => true, ]);
Если нужно обработать все записи, делайте пачками:
$paged = 1; do { $query = new WP_Query([ 'post_type' => 'post', 'posts_per_page' => 100, 'paged' => $paged, 'fields' => 'ids', ]); foreach ($query->posts as $post_id) { // обработка одной записи } $paged++; wp_reset_postdata(); } while ($query->max_num_pages >= $paged);
Увеличивать memory_limit можно как временную меру, но это не исправляет архитектуру. Если код должен работать при росте записей, он обязан использовать пагинацию/пакетную обработку и не держать всё в памяти.