@vLaZoV

Почему медленно загружается страница на PHP, которая берёт данные из MySQL?

На странице статьи на форуме скрипт должен выводить все комментарии к посту учитывая их иерархию. Я реализовал это самым просты способом: написал функцию-генератор, который возвращает запись из БД при каждой итерации цикла foreach. Реализуется класс для работы с БД PDO. Всё работает, комменты выводит, но страница грузится оооочень долго. Плюс в консоли выходит варнинг:
Unchecked runtime.lastError: The message port closed before a response was received. article.php:1

Два вопроса:
1. Почему это происходит, и как это пофиксить?
2. Может ли это быть связано с тем, что у меня слабый ПК? Скрипт запускаю на localhost, т. к. реальный хост пока себе позволить не могу, да и незачем.

Собственно, связанные с вопросом участки кода:
<?php
function getComment($article_id, $parent, $pdo) {
    $order = $parent == 0 ? "DESC" : "ASC";
    
    $comments = $pdo->prepare("SELECT * FROM comments WHERE article_id = :article_id AND parent = :parent ORDER BY put_date $order");
    $comments->execute([
        "article_id" => $article_id,
        "parent" => $parent
    ]);
    while ($line = $comments->fetch(PDO::FETCH_ASSOC)) {
        yield $line;
        if(entryExists(getPDO(), $line["id"], "parent", "comments")) getComment($article_id, $line["id"], $pdo); // Этот участок пробовал убирать и проблема не ушла, так что это не из-за рекурсии
    }
}
?>

<!-- другой код... -->
<div class="comments_block">
    <? $pdo = getPDO();
        foreach (getComment($_GET["id"], 0, $pdo) as $line) { ?>
        <div class="comment">
            <!-- блок комментария, который использует данные из возвращённого $line -->
        </div>
    <? } ?>
</div>
<!-- другой код... -->

/*
entryExists() проверяет наличие записи в БД
getPDO() просто возвращает PDO-объект, сделал её для краткости
с этими функциями всё в порядке
*/


Что пробовал:
-Ограничить запрос в БД, т. е. сделать как бы разбиение по страницам
-Убрать весь остальной код, чтобы убедиться что проблема именно в комментариях
-Убрать рекурсию из функции, т. е. последнюю строчку 'if(entryExists...'
-Использовать fetchAll();
Ничего из этого не помогло. Помогите пожалуйста
  • Вопрос задан
  • 1153 просмотра
Пригласить эксперта
Ответы на вопрос 2
@Lex85
По моему опыту, дёргать таблицу в цикле — плохая идея. Попробуйте сначала получать все данные, а потом в цикле их разбирать.
Ответ написан
VladimirAndreev
@VladimirAndreev
php web dev
для начала - сделайте explain ваших запросов...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы