Кеширование динамических изображений, загружаемых через PHP / AJAX / JSON / jQuery - PullRequest
2 голосов
/ 21 марта 2012

Я постараюсь быть здесь максимально подробным.

Приложение, над которым я работаю, позволяет администраторам создавать папки, а затем загружать фотографии в эту папку.Дисплей похож на Pinterest, где он загружает все фотографии в коллаж на одном экране.Он отлично работает, когда у вас всего 5-6 фотографий, но это случается редко.Как только вы начнете получать намного больше фотографий, оно станет медленнее.Другое дело, что всякий раз, когда вы удаляете изображение или повторно входите в эту папку, весь дисплей должен быть перезагружен.Мне нужен какой-то способ кеширования этих изображений.

Вот логика моего сценария:

На dashboard.php, есть два включения в JavaScript: homepageActions.js и fileManager.js.homepageActions.js имеет скрипт document.ready(), который вызывает функцию javascript, showFiles().

Таким образом, для краткости, как только загружается документ, вызывается функция showFiles(),Эта функция выглядит следующим образом:

function showFiles(directoryName) {
  $.ajax({
    url: 'displayRecords.php',
    type: 'post',
    data: ({directoryName:directoryName}),
    dataType: 'json',
    success: function(data) {
        constructTable(data);
        $(document).find("a[rel*='lightbox']").lightBox();
    }
  });
}

В эту функцию передан путь к папке.Оттуда AJAX-скрипт вызывает PHP-скрипт, который просматривает эту папку и получает список всех каталогов и изображений в этой папке.Затем он создает строку JSON, в которой содержатся сведения о каждой подпапке и изображении в папке, в которую он был первоначально передан. Как только этот сценарий успешно возвращается, вызывается другая функция constructTable(data), которая передает строку JSON в функцию.

Вот тут-то и начинаются проблемы.

Функция constructTable() содержит около 240 строк кода, которые я не буду здесь включать, потому что за ней трудно следить,Подводя итог, эта функция анализирует строку JSON, выясняет, какие записи являются каталогами, а какие - файлами.Из этого он создает два массива: массив папок и массив файлов.

Сначала я обрабатываю все папки и отображаю их соответствующим образом.С этой частью все в порядке, и меня это не беспокоит.

После этого я начинаю просматривать изображения.Для каждого изображения я пишу много кода вокруг него.Есть div, ссылки и другая разметка HTML, окружающая каждое изображение.Короче говоря, у меня есть цикл for ... next, который просматривает каждый путь к файлу (собранный из JSON), и я создаю длинную строку HTML, которую затем использую jQuery для добавления в DIV.Так что в конечном итоге это выглядит примерно так:

for (var a = 0; a < numPhotos; a++) {
   photoCode += "<div id='outside-container-"+a+"'>";
   photoCode += "<a rel='lightbox' class='photo-link' href='"++"'>";
   photoCode += "<img src='http://" + rootURL + "/uploads/"+fileNameArray[a] + "' width='200' class='photo-thumb'/></a>";
   photoCode += "</div>";

   $("#column1").append(photoCode);
}

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

Ответы [ 2 ]

7 голосов
/ 22 марта 2012

Итак ... эта проблема имеет не только одну причину, давайте рассмотрим их:]

  1. JavaScript блокирует страницу во время работы функции: во время работы функции, вся страница остается заблокированной, пока она не перестанет работать.Обычно это занимает миллисекунды и не воспринимается людьми, но когда у вас есть трудный процесс внутри цикла, он может занять несколько секунд, и тогда он будет хорошо виден.
  2. Большие изображения могут заниматьслишком долго для загрузки: чем больше файл, тем дольше он загружается;если у вас около 100 изображений с 5 МБ среднего размера, загрузка всех этих файлов займет много времени (они не загружаются параллельно).
  3. Загрузка файла параллельного интерфейса: в браузерах есть ограничение на количество запросов на каждом хосте (any.thing.com);Поэтому, если вы пытаетесь загрузить 100 изображений на одном хосте (www.yourhost.com/images/#ndomimgname}), вы не сможете загрузить их все параллельно, браузер выполнит количество возможных запросов дляодин хост, а затем поставьте в очередь все остальные.

Хорошо, теперь вы знаете некоторые проблемы HTTP для страниц с большим количеством запросов, давайте перейдем к решениям: D

  1. Блок JavaScript: это не ваш случай, но для решения этой проблемы вы должны нарушить синхронность JavaScript.Как?
    • Удалить цикл;
    • Создать функцию с кодом внутри цикла;эта функция должна получить список и индекс для элемента;
    • В вашей новой функции вы будете работать только с элементом для полученного индекса, а затем снова вызвать функцию (например, рекурсивность), увеличивая индекси с помощью функции setTimeout ( это нарушит синхронность )
  2. Большие изображения: решить это легко;главное для этого решения - показать большие пальцы вместо реальных изображений.Вы можете использовать скрипт, предложенный @ MichalPlško ( phpThumb ).Кроме того, вы должны ограничить количество загружаемых изображений и загружать больше по требованию, как это делает Pinterest (подкачка с автоматической загрузкой).
  3. Параллельная загрузка файлов: это должно быть вашим реальнымпроблема;Это не так просто, но решить это не ад: D Вам просто нужно создать несколько поддоменов и заставить их указывать на правильное местоположение, например img01.yourdomain.com указывать на папку с изображениями или что-то в этом роде.
0 голосов
/ 21 марта 2012

Вы можете улучшить поведение кэширования, используя скрипт с именем phpThumb () .Он генерирует миниатюрные изображения на лету, а также обрабатывает кэширование изображений на сервере и в браузере.С веб-сайта проекта:

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

Поэтому, если вы считаете, что ваши проблемы могут быть вызваны такими вещами, как создание миниатюр, кэширование изображений и тому подобное, попробуйте.У меня есть отличные результаты с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...