@sidorchik

Как получать результаты php-файла по частям?

Я делаю поиск книг в библиотеках Москвы. Страницы грузятся долго, ищу решение, как ускорить загрузку. Посчитал уместной поисковую выдачу по частям.

Приведу упрощённый пример.

На странице — поле «Название книги» и кнопка. После нажатия кнопки выводится, в каких библиотеках есть книга. Это происходит без перезагрузки страницы.

Проблема в том, что в PHP результат функции checkLibraryOne приходит через секунду, а результат checkLibraryTwo приходится ждать 5 секунд.

Нужно сначала вывести пользователю результат checkLibraryOne, а потом, как придёт,— checkLibraryTwo.

Как это сделать?

HTML:
<!DOCTYPE html>
<html lang="ru">
    <head>
        <meta charset="UTF-8">
        <title>Booksearcher</title>
    </head>
    <body>
        <form>
            <input type="text" name="bookTitle" placeholder="Название книги" id="bookTitle" required autofocus>
            <input type="button" name="submit" value="Найти" id="submit">
        </form>

        <script>
            document.addEventListener('DOMContentLoaded', start);
            function start() {
                document.getElementById('submit').addEventListener('click', searchLibraries);
            }

            function searchLibraries() {
                let bookTitle = document.getElementById('bookTitle').value;
                let params = 'bookTitle=' + bookTitle;

                let xhr = new XMLHttpRequest();
                xhr.open('POST', 'server.php');
                xhr.onreadystatechange=()=>{
                    if (xhr.readyState === 4) {
                        if (xhr.status === 200) alert(xhr.responseText);
                        else alert('Ошибка: ' + xhr.status);
                    }
                };
                xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
                xhr.send(params);
            }
        </script>
    </body>
</html>


PHP:
<?php
    function checkLibraryOne($bookTitle) {
        sleep(1);
        echo 'Деловая библиотека';
    }

    function checkLibraryTwo($bookTitle) {
        sleep(5);
        echo 'Библиотека Некрасова';
    }

    $bookTitle = $_POST['bookTitle'];
    checkLibraryOne($bookTitle);
    checkLibraryTwo($bookTitle);
  • Вопрос задан
  • 194 просмотра
Пригласить эксперта
Ответы на вопрос 2
Stalker_RED
@Stalker_RED
Проще всего отправить два отдельных запроса.
Ответ написан
iit
@iit
TeamLead + php/js разработчик
Проблема медленной загрузки не в js и даже не в php а в api/бд которые дергает
checkLibraryOne и checkLibraryTwo.

Если используется база - тогда оптимизируем её, если api - тогда
- Кешируем ответы api
- Создаем отдельные точки вызова для каждого метода
- Создаем объект в котором будет храниться список библиотек
- Создаем на каждую точку свой ajax запрос который модифицирует список
- При модификации списка обновляем и сам dom
- Если список пуст и запросы еще pending - тогда показываем spinner чтобы все видели что мы что-то грузим
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы