WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru Самая быстрая Тема-конструктор для WordPress

Утечка памяти или проблемы с wp_insert_post()

Написал плагин импорта записей со стороннего API. Новые записи кастомный тип постов.

Всё работает хорошо и без проблем в случаях когда записи на создание/обновление приходило в пределалах 150.

Возник случай когда записей пришло 1500 и выделенные 512Мб на сервере стало не хватать.

С помощью:

memory_get_usage()

Выявил момент когда возникает рост памяти.

wp_insert_post(); // обновляем/сохраняем пост рост на 0,1
wp_update_post(); // привязываем картинку рост на 0,3

После сохранения/обновления поста и картинки к нему потребление памяти возростает на 0,1 - 0,4 Мb.

В итоге с начала работы скрипта 42Mb постепенно обходя записи в цикле память заполняется и вылетает ошибка.

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 319488 bytes) in /home/soaresmendonca/web/soaresmendonca.pt/public_html/wp-includes/wp-db.php on line 2984

Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 266240 bytes) in /home/soaresmendonca/web/soaresmendonca.pt/public_html/wp-includes/wp-db.php on line 2033

Сталкивался ли кто с такой проблемой или знаете как устранить этот дефект?

0
Vicos
2 месяца назад
  • 1
    Kama7871

    Вот еще вариант, технически для WP самый подходящий в этом случае. См. функцию wp_suspend_cache_addition() в частности второй пример:

    Допустим, мы импортируем большой массив данных в WordPress. К примеру, нам нужно заполнить таблицу записей из другой базы данных...

    // запомним текущее состояние (это пример, что так тоже можно делать)
    $was_suspended = wp_suspend_cache_addition();
    
    // отключаем кэширование
    wp_suspend_cache_addition( true );
    
    // тут код импорта. Объектное кэширование здесь уже не работает
    
    // вернем прежнее состояние кэша обратно
    wp_suspend_cache_addition( $was_suspended );

    Проблема тут в том, что ВП очень многое, в частности записи, всегда кэширует в память - вот и переполняется.

    Vicos месяц назад

    Хорошее решение, и переделать быстро.

    Комментировать
  • 0
    el-lable385 el-lable.ru

    Так и должно быть.
    Вам надо разбивать операции и обрабатывать порциями.
    Например по 100 постов.

    Vicos 2 мес назад

    Так почему так быть должно? Почему после вставки записи, когда всё уходит в БД в памяти остаётся что-то и копится.
    Вариант разбвики на пачки по 100 записей даже пока и не знаю как задачу что выполняет cron разбить на мелкие части, но если решения не найдётся, то буду переделывать.

    el-lable 2 мес назад

    А если вы еще работаете с картинками то вообще надо разбивать операции по каждому посту отдельно, генерация всех миниатюр дело затратное...

    Vicos 2 мес назад

    В общем буду разбираться.
    Добавил принудительный вызов GC после вставки каждого поста.

    gc_collect_cycles();

    Ни чего не поменялось.

    Комментировать
  • 1

    Возможно проблема в том, что запись после добавления попадает в объектный кеш.

    Можно попробовать после добавления записи удалять ее из кеша

    clean_post_cache( $post_id )
    Vicos 2 мес назад

    Оно! Спасибо!
    Память перестала расти.

    Комментировать
  • 2

    При выполнении операций импорта с большим количеством данных стоит использовать библиотеку
    https://github.com/deliciousbrains/wp-background-processing
    она позволит запустить процедуру импорта каждого элемента как отдельный процесс, при этом сама задача будет работать в фоновом режиме. beach smile

    Vicos 2 мес назад

    Спасибо! Попробую обсудить с проджектом этот момент, может и переделаю. А на будущее уже буду рассматривать сразу эту библиотку.

    Комментировать
На вопросы могут отвечать только зарегистрированные пользователи. Вход . Регистрация