@IvanRu08

Как бороться с утечкой памяти WordPress?

Всем привет. Столкнулся с задачей обновления мета данных у 60к+ постов. Прохожусь по всем циклом foreach:

foreach ( $product_ids_list as $id ) {
        cr_product_fill_meta( $id );
        error_log( 'after memory usage: ' . memory_get_usage() );
        $i


Функция cr_product_fill_meta:
function cr_product_fill_meta ( $prod_id ) {
    //товар можно редактировать?
    $is_product_blocked_edit = get_post_meta( $prod_id, 'is_product_blocked_edit', true );
    unset ( $is_product_blocked_edit );
  }
  add_action( 'save_post', 'cr_product_fill_meta' );


Сейчас из функции убрано все лишнее. Но даже то, что есть сжирает память очень быстро и я не понимаю почему. Вот что вижу в логе:
[04-May-2020 10:17:24 UTC] before memory usage: 66954464
[04-May-2020 10:17:50 UTC] before memory usage: 66954464
[04-May-2020 10:17:51 UTC] after memory usage: 66992384
[04-May-2020 10:17:51 UTC] after memory usage: 67011952
[04-May-2020 10:17:51 UTC] after memory usage: 67031520
[04-May-2020 10:17:51 UTC] after memory usage: 67051088
[04-May-2020 10:17:51 UTC] after memory usage: 67070656
[04-May-2020 10:17:51 UTC] after memory usage: 67090544
[04-May-2020 10:17:51 UTC] after memory usage: 67110112
[04-May-2020 10:17:51 UTC] after memory usage: 67129680
...................................................................
[04-May-2020 10:17:55 UTC] after memory usage: 226265440
[04-May-2020 10:17:55 UTC] after memory usage: 226284416
[04-May-2020 10:17:55 UTC] after memory usage: 226303392
[04-May-2020 10:17:55 UTC] after memory usage: 226322368
[04-May-2020 10:17:55 UTC] after memory usage: 226341344
[04-May-2020 10:17:55 UTC] after memory usage: 226360320
[04-May-2020 10:17:55 UTC] after memory usage: 226379296


И потом все упирается в memory_limit (даже 10к постов не проходит). Куда уходит память, если я создаю переменную и сразу ее убиваю?? Скрипт запускается ajaxом, если это важно
  • Вопрос задан
  • 349 просмотров
Решения вопроса 1
glaphire
@glaphire Куратор тега PHP
PHP developer
перебор 60к элементов - это загрузка 60к элементов в память, так не принято делать и превышение лимита памяти это закономерная проблема. Обрабатывайте данные пачками (select с limit и offset), так сможете циклом выбирать очередную пачку данных и обрабатывать их поэлементно. По сути это пагинация
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Отключите кеширование всего, чего можно.
И коментарий Daria Motorina - по сути, это ответ.
Ответ написан
Комментировать
@d-stream
Готовые решения - не подаю, но...
Хм... а sql update чем не угодил?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы