Как можно оптимизировать генерацию и загрузку боьшого html?
Мой скрипт выбирает из базы данные по условию, порядка пары тысяч записей (количество постоянно увеличивается), потом всё это обрабатывается на php, затем брузер всё это печатает на странице php циклом. Итоговый документ имеет порядка 230к строк и вес около 40-70 мегабайт, иногда доходит до сотни. Соответственно загрузка длится 15-20 секунд при включенном gzip.
Кэш наверное подключить не получится, потому что с базой работают несколько человек, и данные по старым записям часто меняются. Насчёт кэша, правда я не уверен.
Вопросы такие: какие есть способы ускорить загрузку страницы? Можно ли её рендерить на клиенте при помощи js?
И почему на смартфоне в мобильном safari та же самая страница грузится за пару секунд? Можно ли этот эффект повторить на десктопе?
Дополнительно:
Делай пагинацию
Обычно используют постраничную навигацию и фильтры.
Я сильно сомневаюсь что живому человеку может быть нужно иметь на странице 200k строк в таблице.
В общем, решать эту проблему надо не техникой, а правильным проектированием.
Вопросы такие: какие есть способы ускорить загрузку страницы?
Во первых - выяснить что тормозит: бэкенд или фронтенд. Сделать профайлинг бэкенда, сделать анализ загрузки фронта. Соответственно сначала понять что тормозит.
Можно ли её рендерить на клиенте при помощи js?
Можно, но скорее всего прироста вы особо не получите. Если проблема на бэкенде - метод рендера будет абсолютно по барабану. Если на форнте - скорее всего будет медленнее, так как вы сначала получите все данные, а потом еще будете средствами языка (а не движка браузера, который очевидно быстрее) отрисовывать хтмл.
И почему на смартфоне в мобильном safari та же самая страница грузится за пару секунд?
Опять же, вопрос скорее к вам чем к кому-либо еще. Возможно кеширование, которое на мобильных браузерах практически всегда более агрессивное. Возможно вы просто не видите как тормозит загрузка, например в силу другого метода рендеринга, который сразу при получении данных выводит все что возможно, в то время как на стационаре рендеринг идет только после загрузки тега целиком. Достаточно например быстро промотать на сафари вниз при загрузке, чтобы увидеть что загрузилось далеко не все... А возможно в мобильной версии отображается сильно меньше элементов...
Можно ли этот эффект повторить на десктопе?
Если есть что повторять... Можно попробовать сделать таблицу не цельной, а разбить на несколько таблиц, по 100-300 строк. Или еще адкеватнее - сверстать дивами.
Как вариант - лэзилоад, по мере прокруки страницы подгружать новые данные по мере необходимости, что сильно снизит как трафик в целом, так и тормоза рендера.
PS:
я тоже склоняюсь к неэффективной вёрстке. Если я эту вёрстку буду генерировать js’ом, процесс ускорится?
Скорее всего, как я уже написал, скорости не прибавится. Вообще что мешает проверить эффективность верстки? Тупо выведите все строки дивами, без всяких разделителей, одна строка - один див с данными, разделенными "|" например, и посмотрите на разницу.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для оптимизации генерации и загрузки большого HTML-кода, можно использовать следующие методы:
1. **Минимизация CSS и JavaScript**: Уменьшение размера файлов CSS и JavaScript путем удаления неиспользуемых стилей и скриптов, объединение файлов и минификация кода поможет уменьшить объем передаваемых данных.
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' />"; }
3. **Кэширование данных**: Использование кэширования для хранения уже сгенерированного 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) { // обработка данных } }); }
5. **Оптимизация изображений**: Использование сжатых изображений, форматов изображений с поддержкой сжатия (например, WebP) и lazy loading изображений помогут улучшить скорость загрузки страницы.
function compress_image($image) { // Сжатие изображения }
Эти методы помогут оптимизировать генерацию и загрузку большого HTML-кода, улучшить скорость загрузки страницы и повысить пользовательский опыт.