Plugin exceeds memory limit

时间:2017-08-28 作者:beeef

我正在使用该功能从WordPress网站批量删除帖子wp_delete_post 和类别使用wp_delete_category. 这大约是100000篇帖子和4000个类别,过了一段时间,我得到了一个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);
删除帖子是可行的,删除某些类别也是可行的——但在某个时候,内存限制被超过,脚本被终止。将内存限制设置为1024MB对我来说似乎不是一个完美的解决方案。

有没有办法释放WordPress功能分配的内存?

3 个回复
SO网友:Milan Petrovic

您使用的代码还使用WordPress函数,这些函数将首先在内存中加载帖子(和其他相关数据),然后使用对象缓存对其进行缓存。因此,要删除100000篇文章,您的代码将尝试在内存中加载每篇文章,这可能会占用大量内存。我不确定您的PHP内存设置有多高,但是,您可以将一次删除的帖子限制为1000或5000篇,也可以增加PHP内存。

SO网友:Mark Kaplun

由于要删除的帖子太多,最好摆脱Web服务器的限制,使用wp clirelevant example. 另一种选择是不使用实时服务器,而是将所有内容卸载到本地开发服务器,在那里运行代码,然后将内容上载回。

SO网友:johnh10

我建议您的第一行代码是

wp_suspend_cache_addition( true );
这将阻止数据添加到缓存中,并导致内存膨胀。

结束

相关推荐

WordPress可以在现有php站点的根目录下运行,但在index.php上没有主题,但所有其他WP帖子/页面都可以吗?

希望这能帮助其他有类似情况的人,我搜索了又搜索,似乎找不到解决方案。也许我用词不对?简而言之:默认帖子应该在/blog/处循环,默认帖子应该遵循该路径,/blog/post title/特定类别应该在/category/处循环,该类别的帖子应该遵循该路径,/category/post title/现有php站点具有索引的函数和变量。php需要访问,因此它无法为主页运行主题引擎,也不需要运行任何不必要的数据库调用,除了2篇最新文章之外,我假设可以使用wordpress在网站根目录中创建文件夹结构,但我不确定