[英]Speed up PHP recursive function
我試圖通過使用遞歸從數據庫中獲取值來創建多級動態PHP菜單。 但是頁面速度越來越慢。 數據庫中記錄的數量增加。 當前,數據庫中只有大約15條記錄。
這是代碼:
<div id="nav">
<?php
$menu_html='';
function render_menu($parent_id){
$con=mysqli_connect("localhost","root","","test");
global $menu_html;
$result=mysqli_query($con, "select * from menu where parent_id=$parent_id");
if(mysqli_num_rows($result)==0) return;
if($parent_id==0)
$menu_html .= "<ul>";
else
$menu_html .= "<ul>";
while($row=mysqli_fetch_array($result)){
$menu_html .= "<li><a href=\"{$row['link']}\">{$row['label']}</a>";
render_menu($row['id']);
$menu_html .= "</li>";
}
$menu_html .= "</ul>";
return $menu_html;
}
echo render_menu(0);
?>
</ul>
</div>
這是我的數據庫的樣子:
請幫忙,讓我知道如何優化頁面速度。
謝謝
您正在執行多個可以避免的數據庫查詢。
一次性獲取所有內容並遍歷各行以構建菜單。 您將擁有使用父ID來構建嵌套數組所需的一切。
如果那之后仍然很慢,您可以考慮緩存數據庫結果,甚至整個呈現的菜單。
您最好將其緩存在文件或內存中,特別是在編輯菜單項或向數據庫中添加新菜單項時刪除緩存的項,以便可以更新緩存。 然后,您不必擔心要緩存多長時間,只需無限期地緩存即可。
我想建議您學習嵌套的集合樹: 在MySQL中管理層次數據 ,它僅允許1個select / query來構建菜單,而無需遞歸函數調用。
嘗試這個:
<div id="nav">
<?php
$menu_html='';
function render_menu()
{
global $menu_html;
$con=mysqli_connect("localhost","root","","test");
$result=mysqli_query($con, "SELECT * FROM menu ORDER BY parent_id ASC;");
$menu = array();
while($row=mysqli_fetch_array($result))
{
if($row['parent_id'] == 0)
{
$menu[$row['id']] = array
(
'label' => $row['label'],
'link' => $row['link'],
'children' => array()
);
}
else
{
$menu[$row['parent_id']]['children'][] = array
(
'label' => $row['label'],
'link' => $row['link']
);
}
}
$menu_html = '<ul>';
foreach($menu as $menu_item)
{
$menu_html .= '<li>';
$menu_html .= '<a href="'.$menu_item['link'].'">'.$menu_item['label'].'</a>';
if((bool)$menu_item['children'])
{
$menu_html .= '<ul>';
foreach($menu_item['children'] as $child)
{
$menu_html .= '<li>';
$menu_html .= '<a href="'.$child['link'].'">'.$child['label'].'</a>';
$menu_html .= '</li>';
}
$menu_html .= '</ul>';
}
$menu_html .= '</li>';
}
$menu_html .= '</ul>';
return $menu_html;
}
echo render_menu();
?>
</div>
感謝大家的指導並向我展示正確的前進道路。 我遵循了此鏈接並完成了它。
http://wizardinternetsolutions.com/articles/web-programming/dynamic-multilevel-css-menu-php-mysql
謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.