我有一个用PHP编写的自定义函数,用于Wordspress主题。当我最初编写它时,它完全按照预期工作(它从ID返回一个术语的父母和祖父母等)。
然而,几个小时后,它开始抛出503个错误。为什么这只会在一段时间后发生?是否有某种内存泄漏会随着时间的推移而累积?
$ancestors = $terms[0]->term_id.GetAncestors($terms[0]->term_id,$include);
function GetAncestors($term_id,&$include) {
$child_term = get_term( $term_id, \'category\' );
$parent_term = get_term( $child_term->parent, \'category\' );
$include.=\',\'.$parent_term->term_id;
if($parent_term->parent!=11) {GetAncestors($parent_term->term_id,$include);}
return $include;
}
是函数本身导致了问题,还是我以某种方式使用它,例如使用对象的引用作为变量之一?
最合适的回答,由SO网友:Nicolai Grossherr 整理而成
使用WordPress函数怎么样get_ancestors()
, 哪一个
返回包含给定对象父对象的数组。
确切地说
层次结构中从最低到最高的祖先数组
我们可以使用implode
为此:
function wpse185971_get_ancestors_list(
$object_id,
$object_type = \'category\',
$separator = \',\'
) {
$ancestors_array = get_ancestors( $object_id, $object_type );
$ancestors_list = implode( $separator, $ancestors_array );
return $ancestors_list;
}
SO网友:Howdy_McGee
如果非要我猜的话,我会说你遇到了一个像你建议的那样的内存泄漏,无限递归循环。您需要检查术语何时到达祖先树的顶部或出现错误:
$ancestors = $terms[0]->term_id.GetAncestors( $terms[0]->term_id, $include );
function GetAncestors( $term_id, &$include ) {
$child_term = get_term( $term_id, \'category\' );
$parent_term = get_term( $child_term->parent, \'category\' );
$include .= \',\' . $parent_term->term_id;
if( ! empty( $parent_term ) && $parent_term->parent != 11 ) { // We\'ve reached the top - parent term_id is 0
GetAncestors( $parent_term->term_id, $include );
}
return $include;
}
最终,
$parent->term_id
将等于
0
我们不能再往上爬了。我们需要对此进行测试,一旦达到目标就退出。我想,如果您打开调试,您将看到与此函数相关的大量非对象错误。PHP函数
empty()
检查
null
和
0
所以这应该足够了。