Почему в WP ошибка Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 33554440 bytes)?

Ссылка скопирована
1 ответ

При получении записей - вылазит вот эта ошибка

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мб

  • запросы в цикле это всегда дорого. Попробуй сократить количество, оставив лишь 1 get_post_meta() с пустым параметром $key.
  • Айнур Валиев, А как если не в цикле сделать?

    Имеешь ввиду попробовать так? Если да, то не помогло

    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, ]; } }

  • crack_user, да, так, только $dataTurnir должен содержать все мета поля.
    будет
    $dataTurnir['Дата турнира']
  • Зачем вам 256 мегабайт?
  • как я понял у меня 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

    Нужно решить такую задачу?

    Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

    Заказать помощь
    Лучший ответ
    1
    Роман IT Ответ

    Ошибка Allowed memory size exhausted означает, что PHP-скрипт съел весь доступный лимит памяти. Если записей всего около 500, проблема обычно не в количестве как таковом, а в том, что запрос забирает слишком много данных или потом тяжело обрабатывает их в PHP.

    Типичные причины:

    • posts_per_page => -1 и загрузка всех записей сразу;
    • запрос полных объектов, когда нужны только ID;
    • внутри цикла вызываются тяжёлые ACF/мета/картинки;
    • несколько вложенных WP_Query;
    • нет пагинации;
    • сохраняется большой массив в память.

    Если нужны только ID:

    $query = new WP_Query([
        'post_type'      => 'post',
        'posts_per_page' => 100,
        'fields'         => 'ids',
        'no_found_rows'  => true,
    ]);

    $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);

    $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 можно как временную меру, но это не исправляет архитектуру. Если код должен работать при росте записей, он обязан использовать пагинацию/пакетную обработку и не держать всё в памяти.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно