我现在已经超过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";
您会注意到,随着条件的添加,脚本速度变慢,插入时间会更长。此外,内存使用量在天文数字上增长。我想知道可以做些什么来防止内存泄漏以及减速的原因是否是内存使用情况。我确实调试了wp查询,但他们似乎不是放慢速度的原因。
非常感谢任何帮助。我试图用xhprof来描述它,但没有成功。
答案 0 :(得分:5)
这可能已经很长时间了,也许你现在已经弄明白了,但我最近遇到过这个问题,所以这就是:
wp_insert_posts()
,在其执行路径的某个点上,执行对get_terms()
的调用,检索您正在处理的分类法的所有术语ID。这些ID也会缓存在WordPress的缓存中。
如果你的分类中有很多(1000s)的术语(在你的情况下是'类型'),缓存的大小会急剧增加,这会导致高内存使用(甚至由于内存耗尽而导致的致命错误,这取决于PHP和WordPress的相关性极限)。
我能够实现的唯一解决方法是计算已插入的术语数量,并在每次插入时显式清除WordPress的缓存(大约100秒)。
您可以致电wp_cache_flush()
清除缓存。
例如,您可以将其包含在循环中的某个位置:
if ( $i % 500 == 0 ) {
wp_cache_flush();
}