Как можно оптимизировать генерацию и загрузку боьшого html?

Ссылка скопирована
1 ответ

Мой скрипт выбирает из базы данные по условию, порядка пары тысяч записей (количество постоянно увеличивается), потом всё это обрабатывается на php, затем брузер всё это печатает на странице php циклом. Итоговый документ имеет порядка 230к строк и вес около 40-70 мегабайт, иногда доходит до сотни. Соответственно загрузка длится 15-20 секунд при включенном gzip.
Кэш наверное подключить не получится, потому что с базой работают несколько человек, и данные по старым записям часто меняются. Насчёт кэша, правда я не уверен.

Вопросы такие: какие есть способы ускорить загрузку страницы? Можно ли её рендерить на клиенте при помощи js?
И почему на смартфоне в мобильном safari та же самая страница грузится за пару секунд? Можно ли этот эффект повторить на десктопе?

Дополнительно:

Делай пагинацию

  • Первый и очевидный вопрос, а клиенту точно нужно все 40 мегабайт сразу?

    Обычно используют постраничную навигацию и фильтры.

  • Lynn «Кофеман», WapSter это уже с пагинацией. Данные разбиты по месяцам, соответственно записи за один месяц и весят со всей разметкой.
  • runapa, значит надо дробить ещё

    Я сильно сомневаюсь что живому человеку может быть нужно иметь на странице 200k строк в таблице.

    В общем, решать эту проблему надо не техникой, а правильным проектированием.

  • Lynn «Кофеман», 200к строк занимает html документ со всеми тэгами и скриптами
  • Ну либо у вас о-о-о-чень неэффективная вёрстка, либо всё равно информации слишком много.
  • Lynn «Кофеман», я тоже склоняюсь к неэффективной вёрстке. Если я эту вёрстку буду генерировать js’ом, процесс ускорится?
  • runapa, забирайте сырые данные через ajax, и рисуйте уже таблицу на клиенте, плюс естественно постраничка и фильтры
  • Вопросы такие: какие есть способы ускорить загрузку страницы?

    Во первых - выяснить что тормозит: бэкенд или фронтенд. Сделать профайлинг бэкенда, сделать анализ загрузки фронта. Соответственно сначала понять что тормозит.

    Можно ли её рендерить на клиенте при помощи js?

    Можно, но скорее всего прироста вы особо не получите. Если проблема на бэкенде - метод рендера будет абсолютно по барабану. Если на форнте - скорее всего будет медленнее, так как вы сначала получите все данные, а потом еще будете средствами языка (а не движка браузера, который очевидно быстрее) отрисовывать хтмл.

    И почему на смартфоне в мобильном safari та же самая страница грузится за пару секунд?

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

    Можно ли этот эффект повторить на десктопе?

    Если есть что повторять... Можно попробовать сделать таблицу не цельной, а разбить на несколько таблиц, по 100-300 строк. Или еще адкеватнее - сверстать дивами.

    Как вариант - лэзилоад, по мере прокруки страницы подгружать новые данные по мере необходимости, что сильно снизит как трафик в целом, так и тормоза рендера.

    PS:

    я тоже склоняюсь к неэффективной вёрстке. Если я эту вёрстку буду генерировать js’ом, процесс ускорится?

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

    Нужно решить такую задачу?

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

    Заказать помощь
    Лучший ответ
    1
    Сергей Миронов Ответ

    Для оптимизации генерации и загрузки большого HTML-кода, можно использовать следующие методы:

    1. **Минимизация CSS и JavaScript**: Уменьшение размера файлов CSS и JavaScript путем удаления неиспользуемых стилей и скриптов, объединение файлов и минификация кода поможет уменьшить объем передаваемых данных.

    function combine_files($files) {
        $contents = "";
        foreach ($files as $file) {
            $contents .= file_get_contents($file);
        }
        return $contents;
    }

    function combine_files($files) { $contents = ""; foreach ($files as $file) { $contents .= file_get_contents($file); } return $contents; }

    2. **Ленивая загрузка ресурсов**: Загрузка ресурсов (изображений, скриптов, стилей) только при необходимости, когда они становятся видимыми на странице. Это позволяет уменьшить начальное время загрузки страницы.

    function lazy_load_images() {
        echo "<img src='placeholder.jpg' data-src='image.jpg' />";
    }

    function lazy_load_images() { echo "<img src='placeholder.jpg' data-src='image.jpg' />"; }

    3. **Кэширование данных**: Использование кэширования для хранения уже сгенерированного HTML-кода, чтобы избежать повторного вычисления.

    function get_cached_html($key) {
        $html = get_from_cache($key);
        if (!$html) {
            $html = generate_html();
            save_to_cache($key, $html);
        }
        return $html;
    }

    function get_cached_html($key) { $html = get_from_cache($key); if (!$html) { $html = generate_html(); save_to_cache($key, $html); } return $html; }

    4. **Асинхронная загрузка данных**: Загрузка данных асинхронно с помощью AJAX запросов, чтобы не блокировать загрузку основного HTML-кода.

    function load_data_async() {
        $.ajax({
            url: 'data.php',
            success: function(data) {
                // обработка данных
            }
        });
    }

    function load_data_async() { $.ajax({ url: 'data.php', success: function(data) { // обработка данных } }); }

    5. **Оптимизация изображений**: Использование сжатых изображений, форматов изображений с поддержкой сжатия (например, WebP) и lazy loading изображений помогут улучшить скорость загрузки страницы.

    function compress_image($image) {
        // Сжатие изображения
    }

    function compress_image($image) { // Сжатие изображения }

    Эти методы помогут оптимизировать генерацию и загрузку большого HTML-кода, улучшить скорость загрузки страницы и повысить пользовательский опыт.

    Другие ответы (0)

    Пока нет других ответов. Будьте первым, кто поможет автору.

    Ответить на вопрос

    комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *

    Вам также может быть интересно