mysql — ускорение рекурсивной функции PHP

Я пытаюсь создать многоуровневое динамическое меню 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>

Вот как выглядит моя БД:

введите описание изображения здесь


введите описание изображения здесь


Пожалуйста, помогите и дайте мне знать, как я могу оптимизировать скорость страницы.

Спасибо

1

Решение

Я хотел бы рекомендовать вам изучить дерево вложенных множеств: Управление иерархическими данными в MySQL, это позволяет только 1 выбор / запрос для построения вашего меню без рекурсивных вызовов функций.

2

Другие решения

Вы делаете несколько запросов к базе данных, которых можно избежать.

Получить все за один раз и цикл по строкам, чтобы построить меню. У вас будет все необходимое для создания вложенного массива с использованием родительских идентификаторов.

Если после этого все еще медленно, вы можете посмотреть на кеширование результатов базы данных или даже всего отображаемого меню.

Вам, вероятно, лучше кэшировать его в файле или в памяти и специально удалять кэшированный элемент, когда вы редактируете элемент меню или добавляете новый в базу данных, чтобы можно было обновить кэш. Тогда вам не нужно слишком беспокоиться о том, как долго вы кешируете, вы можете просто кешировать это до бесконечности.

4

Попробуй это:

    <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>
0

Спасибо всем за ваше руководство и показывает мне правильный путь, чтобы продолжить.
Я перешел по этой ссылке, и все готово.

http://wizardinternetsolutions.com/articles/web-programming/dynamic-multilevel-css-menu-php-mysql

Спасибо

0
По вопросам рекламы [email protected]