【发布时间】:2011-09-26 16:06:44
【问题描述】:
每当我呈现一个菜单项时,对于我从数据库中找到的每个菜单项,我都会使用它来检查其子菜单。
我的控制器渲染菜单项和递归函数检测其子菜单如下
public function renderAction()
{
$menu = $this -> _request -> getParam('menu');
$itemArray = $this -> getSubItems($menu);
$container = new Zend_Navigation($itemArray);
$this -> view -> navigation() -> setContainer($container);
}
private function getSubItems($menu, $parent = 0) {
$mapperMenuItem = new Apanel_Model_Mapper_MenuItem();
$menuItems = $mapperMenuItem -> getItemsByMenu($menu, $parent);
if(count($menuItems) > 0) {
$itemArray = array();
foreach($menuItems as $item) {
$label = $item -> label;
$uri = $this -> getSubItemUrl($item);
$subItems = $this -> getSubItems($menu, $item -> id);
if(count($subItems)) {
$tArray['pages'] = $subItems;
}
$tArray['label'] = $label;
$tArray['uri'] = $uri;
$itemArray[] = $tArray;
unset($tArray);
}
if(count($itemArray)) {
return $itemArray;
} else {
return null;
}
} else {
return null;
}
}
private function getSubItemUrl($item) {
if(!empty($item -> link)) {
$uri = $item -> link;
} else {
$pageMapper = new Apanel_Model_Mapper_Page();
$details = $pageMapper -> getPageDetails($item -> page_id);
$pageClass = "CMS_Content_Item_".ucwords($details['namespace']);
$page = new $pageClass($item -> page_id);
$title = str_replace(" ", "-", strtolower($details['name']));
$uri = $this -> view -> url(array(
"namespace" => $details['namespace'],
"title" => $title
),'page-view');
}
return $uri;
}
MenuItem Mapper 中的 getItemsByMenu 函数
public function getItemsByMenu($menuId, $parent = 0) {
$select = $this -> getDbTable() -> select();
$select -> where("menu_id = ?", $menuId)
-> where("parent = ?", $parent)
-> order("position");
$items = $this -> getDbTable() -> fetchAll($select);
if($items -> count() > 0) {
return $items;
} else {
return null;
}
}
我的应用程序中呈现了大约 4 种不同类型的菜单,我注意到执行过程中性能显着下降。我经常遇到执行超时,菜单的渲染时间大约为 35 秒,而没有菜单的渲染时间大约为 22 秒。这一切都在本地主机中。我的递归有什么缺陷吗?我可以采取什么措施来提高代码的性能?
【问题讨论】:
-
能否贴出getItemsByMenu和getSubItemUrl的代码?
-
@TimFountain,我已经更新了我的问题。
标签: zend-framework menu profiling execution