Почему не очищается память при запросах к БД?

195
04 февраля 2018, 02:20

Есть участок кода, приведенный ниже, который загружает картинку на сервер, сохраняет её в БД wordpress + thumbnail.

function generateFeaturedImage( $image_url, $post_id, $i  ){
    $upload_dir = wp_upload_dir();
    $filename = basename($image_url).$i;
    if(wp_mkdir_p($upload_dir['path'])) {
        $file = $upload_dir['path'] . '/' . $filename;
    } else {
        $file = $upload_dir['basedir'] . '/' . $filename;
    }
    file_put_contents($file, file_get_contents($image_url));
    $wp_filetype = wp_check_filetype($filename, null );
    $attachment = array(
        'post_mime_type' => $wp_filetype['type'],
        'post_title' => sanitize_file_name($filename),
        'post_content' => '',
        'post_status' => 'inherit'
    );
    $attach_id = wp_insert_attachment( $attachment, $file, $post_id );
    require_once(ABSPATH . 'wp-admin/includes/image.php');
    $attach_data = wp_generate_attachment_metadata( $attach_id, $file );
    wp_update_attachment_metadata( $attach_id, $attach_data );
    set_post_thumbnail( $post_id, $attach_id );
}

Вот такой замер потребления памяти

for($i=0; $i<10; $i++) {
    $START2 = microtime(true);
    generateFeaturedImage('img.jpg', 1778, $i);
    echo 'memory for create img: ' . (memory_get_usage() - $s) . "\n";
    echo "$i time: " . (microtime(true) - $START2) . " sec" . PHP_EOL;
}

показывает следующие результаты

0 time: 0.33364510536194 sec
memory for create img: 156480
1 time: 0.23405408859253 sec
memory for create img: 160816
2 time: 0.23686289787292 sec
memory for create img: 165152
3 time: 0.25216603279114 sec
memory for create img: 169488
4 time: 0.2624979019165 sec
memory for create img: 173824
5 time: 0.29374694824219 sec
memory for create img: 178160
6 time: 0.25813889503479 sec
memory for create img: 182816
7 time: 0.27913498878479 sec
memory for create img: 187152
8 time: 0.32186794281006 sec
memory for create img: 191808
9 time: 0.29191112518311 sec
memory for create img: 196144
Total time: 2.76442694664 sec

То есть, с каждой итерацией, расход памяти увеличивается на ~5000 bytes Если увеличить цикл до 10000 итераций, то расход будет составлять ~50мегабайт. unset() всех переменных в этом куске не помогает. gc_collect_cycles() естественно тоже.

Вопрос: в каком месте накапливается память и почему она не очищается? Если написать запросы собственноручно, удастся ли избежать этого эффекта?

Answer 1

Потому что в WordPress кешируется всё или почти всё. Созданные вами посты типа attachment остаются в кеше, который надо чистить функциями

wp_cache_delete( $post->ID, 'posts' );
wp_cache_delete( $post->ID, 'post_meta' );

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

READ ALSO
Команды /comand в любом регистре

Команды /comand в любом регистре

Как сделать так, чтобы команды типа

218
Как правильно указать путь к директории php?

Как правильно указать путь к директории php?

Есть у меня сайтНа сайте есть два каталога - test и test1

223
Ошибка во всех темах при работе с Wordpress

Ошибка во всех темах при работе с Wordpress

Здравствуйте, недавно начал работать с Wordpress

193
Как в таблице MYSQL выбрать только последние строки по заданным параметрам?

Как в таблице MYSQL выбрать только последние строки по заданным параметрам?

Подсобите новичкуСитуация очень похожая на ту, которая в этом вопросе

239