Инкрементный вывод – JQuery и PHP

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

В моем php-скрипте я использую ob_start и ob_flush для обработки вывода данных для каждого рейтинга. Это отлично работает, если я напрямую загружаю скрипт. Но когда я пытаюсь использовать .get через jquery, загружается весь контент, а затем помещается в контейнер, а не поэтапно добавляется.

Мне интересно следующее

  1. Есть ли способ инициировать размещение данных до завершения get?
  2. Нужно ли мне постоянно проверять сценарий до завершения процесса?
  3. Есть ли более эффективный способ отображения данных вместо получения?

Для таких проблем у меня будет такой подход:

  1. Сохраните старый скрипт, который использует ob_start() и ob_flush() для пользователя, который отключает javascript в своем браузере.
  2. Для пользователя с включенным javascript загружайте предопределенное количество контента по одному за раз. Чтобы различать js включить пользователя и нет, я думаю о 2 странице. На первой странице отображается ссылка на старый сценарий. Затем переместите код jquery на этой странице, чтобы перехватить ссылку на старый скрипт, поэтому нажмите на эту ссылку, чтобы отобразить (или создать) div , а затем загрузить содержимое в этот div .
  3. Вы можете использовать setTimeout для непрерывного вызова AJAX-кода, а затем после достижения определенного условия (Ex, пустой ответ) вы можете удалить setTimeout с помощью clearTimeout . Каждый запрос AJAX должен иметь параметр смещения, поэтому он будет получать контент из последнего вызова AJAX. После получения ответа увеличьте смещение для следующего вызова AJAX. Для этого вы можете использовать глобальную переменную.
  4. Вы можете использовать простую глобальную переменную, чтобы предотвратить выполнение запроса AJAX во время последнего ожидающего ответа AJAX, чтобы предотвратить состояние гонки. Пример кода:

      // блокировка переменной
     var is_running = FALSE;
     // смещение начинается с 0
     var offset = 0;
     function load_content ($) {
       // проверка блокировки
       if (! is_running) {
         //замок
         is_running = true;
         // делать AJAX
         $ .get (URL,
           {PARAM},
           Функция (соответственно) {
             // поместить данные в div
             // ...
             // если пусто, тогда вызовите clearTimeout
             // ...
             // увеличиваем смещение здесь
             смещение = смещение + NUM_ITEM_FETCHED
             // блокировка релиза
             is_running = false;
           });
       }
     } 

Следует обратить внимание на то, что, используя вызов AJAX, вы должны определить ответ вручную, поскольку ob_flush и ob_flush будут иметь никакого эффекта в этом сценарии.

Надеюсь, это поможет вам создать свой собственный код.

JQuery получит статус успеха от вызова ajax, когда полная страница закончит загрузку. Так что все, что вы делаете в php, не будет возвращено на вызывающую страницу до тех пор, пока весь процесс не завершится. (Ajax – это одноразовый / одно-приемная система)

Вам нужно будет усложнить вашу систему, чтобы делать то, что вы хотите.

пример..

  1. ваш php обновляет внешний файл прогресса, и ваш jquery опросает этот файл через некоторый интервал и отображает прогресс.
    Вы должны инициировать интервал опроса на ajax submit, а на ajax – прекратить его.

У меня была аналогичная проблема некоторое время назад, где я хотел, чтобы php-скрипт отправил серию писем и обновил страницу jquery, чтобы сказать что-то вроде «Отправка 23/50».

То, что я закончил, – это настроить скрипт php для обработки одного элемента за раз. Это может также работать в вашем случае. Не могли бы вы jquery передать какой-то идентификатор элемента в php-скрипт, который обрабатывает только один элемент? Затем в обратном вызове вы можете поместить данные для этого элемента на странице, а также создать новый запрос ajax для следующего элемента. Другими словами, каждый обратный вызов создавал новый запрос для следующего элемента до тех пор, пока весь список элементов не будет зациклирован.

Как вы думаете?

-DLH