Плагин превышает ограничение памяти

Я просто wp_delete_post сообщения с моего сайта WordPress, используя функцию wp_delete_post и категории, используя wp_delete_category . Это около 100 000 сообщений и 4.000 категорий, и через некоторое время я получаю ошибку PHP

PHP Fatal error: Allowed memory size of ... bytes exhausted

Это то, что я делаю внутри своего кода:

 // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); с // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); этот // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); не // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); с // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); этот // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); не // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); с // get all IDs from the posts and categories $delete_categories = $wpdb->get_col("SELECT DISTINCT(j.term_id)..."); $delete_posts = $wpdb->get_col("SELECT DISTINCT(j.post_id)..."); $delete_parent_categories = $wpdb->get_col("SELECT tt.parent FROM $tbl_term_taxonomy tt ..."); // I removed the SQL statements for a better reading foreach ($delete_posts as $dp) { echo "deleting post ".$dp."\n"; wp_delete_post($dp, true); unset($dp); } unset($delete_posts); foreach ($delete_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_categories); foreach ($delete_parent_categories as $dc) { echo "deleting category ".$dc."\n"; wp_delete_category($dc); unset($dc); } unset($delete_parent_categories); 

При удалении сообщений работает также удаление некоторых категорий, но в какой-то момент предел памяти превышен, и скрипт завершается. Установка предела памяти на 1024 МБ не является идеальным решением для меня.

Есть ли способ освободить память, которую выделяют функции WordPress?

Solutions Collecting From Web of "Плагин превышает ограничение памяти"

В используемом вами коде также используются функции WordPress, которые сначала загружают сообщения (и другие соответствующие данные) в память и кэшируют их с помощью кэша объектов. Таким образом, чтобы удалить 100 000 сообщений, ваш код попытается загрузить каждый пост в памяти, и это может занять много памяти. Я не уверен, насколько высокая память PHP установлена ​​в вашем случае, но вы можете либо ограничить удаление 1000 или 5000 сообщений сразу, либо увеличить память PHP.

С таким количеством сообщений для удаления лучше избегать ограничений веб-сервера и использовать соответствующий пример wp-cli. Другой альтернативой является не использовать живой сервер, а разгружать все на ваш локальный сервер разработки, запускать там свой код и загружать вещи обратно.

Я рекомендую вашу первую строку кода

 wp_suspend_cache_addition( true ); 

Это приведет к тому, что данные не будут добавлены в кэш-память и заполняющую память.