如何防止wordpress wp_insert_term泄漏内存并减慢速度?

use*_*973 2 php wordpress

我已经超过2天了解这个问题.我需要你的帮助.

我有一个从1到5000的简单循环来插入wordpress术语.似乎wp_insert_term以某种方式泄漏内存并且脚本速度变慢.

考虑下面的脚本(如果你要运行它,你需要将它放在root wordpress dir中):

<?php

$full_start = microtime(true);

include_once 'wp-load.php';



for($i=1;$i<5000;$i++) {

$sub_start = microtime(true);

wp_insert_term('Some Genre Name '.$i, 'genres', array('description' => "Description"));

echo "AT: ".$i." Mem: ".memory_get_usage();

$sub_end = microtime(true);
echo " In: ".($sub_end - $sub_start)." seconds Golabls: ".count($GLOBALS)."\n";

}

$full_end = microtime(true);

echo "Total time: ".($full_end - $full_start)." seconds\n";
Run Code Online (Sandbox Code Playgroud)

您会注意到,随着术语的添加,脚本速度变慢,插入时间会更长.此外,内存使用量在天文数字上增长.我想知道可以做些什么来防止内存泄漏以及减速的原因是否是内存使用情况.我确实调试了wp查询,但他们似乎不是放慢速度的原因.

任何帮助将不胜感激.我试图用xhprof来描述它,没有成功.

小智 6

可能已经很长一段时间了,也许你现在已经知道了,但我最近遇到过这个问题,所以这就是:

wp_insert_posts()在其执行路径的某个点上,执行调用get_terms(),检索您正在处理的分类法的所有术语ID.这些ID也缓存在WordPress的缓存中.

如果你的分类中有很多(1000s)的术语(在你的情况下是'类型'),缓存的大小会急剧增加,这会导致高内存使用(甚至可能是由于内存耗尽导致的致命错误,具体取决于PHP和WordPress的相关限制).

我能够实现的唯一解决方法是计算已插入的术语数量,并在每次插入时显式清除WordPress的缓存(大约100秒).

您可以通过调用清除缓存wp_cache_flush().

例如,您可以将其包含在循环内的某处:

if ( $i % 500 == 0 ) {
    wp_cache_flush();
}
Run Code Online (Sandbox Code Playgroud)