На странице статьи на форуме скрипт должен выводить все комментарии к посту учитывая их иерархию. Я реализовал это самым просты способом: написал функцию-генератор, который возвращает запись из БД при каждой итерации цикла 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();
Ничего из этого не помогло. Помогите пожалуйста