web-dev-qa-db-fra.com

Le plugin dépasse la limite de mémoire

Je supprime en bloc les publications de mon site WordPress à l'aide de la fonction wp_delete_post et les catégories à l'aide de wp_delete_category. Cela fait environ 100.000 articles et 4.000 catégories, et après un moment, je reçois un PHP Error

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

C'est ce que je fais dans mon code:

// 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);

Supprimer les publications fonctionne, supprimer certaines catégories fonctionne également - mais à un moment donné, la limite de mémoire est dépassée et le script est terminé. Définir la limite de mémoire à 1024 Mo ne me semble pas être la solution idéale.

Existe-t-il un moyen de libérer de la mémoire allouée par les fonctions WordPress?

1
beeef

Le code que vous utilisez utilise également des fonctions WordPress qui chargeront d’abord les publications (et autres données pertinentes) en mémoire et les mettront en cache à l’aide du cache d’objets. Donc, pour supprimer 100 000 articles, votre code essaiera de charger chaque article en mémoire, ce qui peut prendre beaucoup de mémoire. Je ne sais pas à quel niveau de mémoire PHP est défini dans votre cas, mais vous pouvez limiter la suppression à 1 000 ou 5 000 messages à la fois ou augmenter la mémoire PHP.

2
Milan Petrovic

Avec autant de messages à supprimer, il est préférable d'échapper aux limitations du serveur Web et d'utiliser l'exemple pertinent wp-cli . L’autre alternative est de ne pas utiliser de serveur actif, mais de tout décharger sur votre serveur de développement local, d’exécuter votre code et de télécharger à nouveau des éléments.

1
Mark Kaplun

Je recommande que votre première ligne de code soit

wp_suspend_cache_addition( true );

Cela empêchera les données d'être ajoutées à la mémoire cache et gonflera la mémoire de remplissage.

0
johnh10