Загрузка изображений в галерею с использованием PHP и JavaScript иногда занимает очень много времени

#javascript #php #xmlhttprequest

#javascript #php #xmlhttprequest

Вопрос:

Функция обратного вызова запускается, когда мой XMLHttpRequest завершен. Я использую асинхронную функцию JavaScript для загрузки содержимого файла, который был создан с помощью функции PHP file_put_contents() .

Моя проблема в том, что иногда загрузка элементов галереи занимает очень много времени. Я бы предпочел вернуть HTML-код, который я хочу загрузить, в виде строки, а не записывать его в файл.. но я не знаю как?

Это мой Javascript:

 function xhr(php, form, after) {
    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        if (xhr.readyState == XMLHttpRequest.DONE) {
            after();
        }
    }
    xhr.open('POST', php, true);
    xhr.send(new FormData($(form)));
}
  

Как я могу получить соответствующий PHP-скрипт для экспорта строки? Мне нужно что-то, что помещает $myExportString в качестве параметра внутри after() , тогда я мог бы использовать это следующим образом:

 xhr("../session/searchquery.php", "searchfilterterms", function( myExportString ) {         

    document.getElementById("someDiv").innerHTML = myExportString;

});
  

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

Комментарии:

1. Есть ли какая-то особая причина, по которой вы не просто возвращаете данные галереи при первом вызове AJAX? Почему вы делаете два? Кроме того, рассмотрите возможность отправки только данных в JavaScript и используйте их для создания HTML локально, вместо того, чтобы пытаться отправлять большие объемы HTML. Вы также должны убедиться, что вы кэшируете надлежащим образом.

2. Существует не два AJAX-вызова, а только один, и именно здесь я возвращаю данные галереи, извините, если это было непонятно. Значительно ли ускоряет процесс создание HTML локально или это просто меньшая вещь? Я бы предпочел делать это только в том случае, если это серьезное улучшение, потому что мне нужно будет внести много изменений, чтобы это сработало..

3. Почему вы сохраняете файл на сервере? Просто верните сгенерированную HTML-строку в ответе на ваш XMLHttpRequest, а затем напишите некоторый Javascript, чтобы поместить этот HTML на вашу страницу. В противном случае у вас а) возникают накладные расходы на дисковый ввод-вывод, и б) вам приходится отправлять 2 запроса на сервер (один для генерации HTML, а другой для извлечения файла, в который он был сохранен). Это совсем не эффективно.

4. Очевидно, что затем будет еще 27 запросов к серверу для загрузки всех отдельных изображений (если вы не закодировали их в кодировке base64 в HTML, вы не упомянули?), Так что это никогда не будет мгновенно. Но вы, безусловно, можете сделать процесс загрузки HTML более эффективным, как я упоминал выше.

5. Спасибо за редактирование. «Как я могу получить соответствующий PHP-скрипт для экспорта строки?» … что ж, если бы вы показали нам соответствующий PHP-код, который в настоящее время генерирует файл, тогда у нас был бы некоторый шанс рассказать вам. Если бы мне пришлось угадывать , вам может просто понадобиться echo строка HTML, а не отправлять ее в file_put_contents или что-то еще.

Ответ №1:

Нет необходимости сохранять файл на сервере. Вы можете просто вернуть сгенерированную HTML-строку в ответе на ваш XMLHttpRequest, а затем написать некоторый Javascript, чтобы поместить этот HTML на свою страницу.

В противном случае а) у вас возникают накладные расходы на дисковый ввод-вывод и б) вам приходится отправлять 2 запроса на сервер (один для генерации HTML, а другой для извлечения файла, в который он был сохранен). Это совсем не эффективно.

В PHP вместо сохранения сгенерированной HTML-строки на диск вы можете повторить ее, например, что-то вроде

 echo $finalVariableWithHTMLString;
  

(Я не знаю вашего точного кода, поскольку он не показан в вопросе). Если вы повторяете его, то оно становится содержимым ответа на вызов AJAX. Вот как вы возвращаете ответ на HTTP-запрос в PHP — вы повторяете содержимое на выходе.

Затем вы можете получить это из xhr.responseText переменной в JavaScript. Таким образом, вы могли бы написать

 after(xhr.responseText);
  

в вашем примере, чтобы передать HTML в вашу after() функцию.