Есть участок кода, приведенный ниже, который загружает картинку на сервер, сохраняет её в БД 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()
естественно тоже.
Вопрос: в каком месте накапливается память и почему она не очищается? Если написать запросы собственноручно, удастся ли избежать этого эффекта?
Потому что в WordPress кешируется всё или почти всё. Созданные вами посты типа attachment остаются в кеше, который надо чистить функциями
wp_cache_delete( $post->ID, 'posts' );
wp_cache_delete( $post->ID, 'post_meta' );
Это те функции, которые удалось увидеть при поверхностном просморте кода ядра, отвечающего за добавление вложений (картинок).
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Есть у меня сайтНа сайте есть два каталога - test и test1
Подсобите новичкуСитуация очень похожая на ту, которая в этом вопросе