Вызов Ajax, выполняемый в фоновом режиме и обновляющий главную страницу

#php #jquery #ajax

#php #jquery #ajax

Вопрос:

Сценарий, в котором у меня есть export.php файл, который удаленно экспортирует 1000 изображений. Он разбит на экспорт 20 изображений, затем перезагрузите и выполняйте следующие 20, пока все изображения не будут экспортированы. Это работает нормально, дело в том, что я хотел сделать его более чистым и запустить в фоновом режиме.

Так как у меня есть jQuery на моем index.php страница Я выполнил простой вызов ajax и надеялся, что ответом будет «20», затем «40» и так далее, показывая, сколько изображений было экспортировано на данный момент. Если бы только это было так просто.

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

Буду признателен за любую помощь, и я надеюсь, что это имеет смысл.

вызов ajax:

 $.ajax({
   url: "export_images.php",
   cache: false,
   success: function(data){
     $("#export_images_result").text(data);
   }
});
  

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

1. У вас есть какие-либо примеры кода, которые вы можете предоставить?

2. Интересно, ваш php уже сообщает что-то в конце каждого пакетного процесса. Если это так, и ваш ajax-скрипт работает, то, скорее всего, отчеты находятся в responseText.

3. Я понимаю проблему. Это потому, что он запускает страницу один раз и возвращает результат от начальной загрузки, который равен 20. Когда export_images.php перезагружается для обработки следующих 20 изображений, занимает всю страницу и запускается так, как если бы я перешел на страницу напрямую. Я ищу, чтобы он продолжал работать в фоновом режиме и обновлял #export_images_result по мере его выполнения. Затем в конце скажите что-то вроде «экспортировано 842 изображения».

Ответ №1:

Вы могли бы просто вызывать php-файл через каждые 20 изображений, используя отдельные ajax-вызовы и разбивку на страницы. Вместо того, чтобы это делал файл php. Я был бы рад привести пример, если вы опубликуете php и остальной javascript.

Я бы рекомендовал не использовать post для такой большой загрузки, но, возможно, общедоступный ftp или что-то в этомроде. POST настолько ненадежен и не дает прогресса и т.д. FTP далек от совершенства, но лучший вариант (imo) для этого типа системы. Хотя, я думаю, иногда вам не приходится выбирать.

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

1. На самом деле это очистка с веб-сайта, поэтому POST не задействован. Могу ли я обернуть это в функцию и заставить ее вызывать ее самостоятельно, пока результат успеха не вернет «Все экспортированные изображения». Затем просто проверьте это в функции и добавьте разрыв.

2. Подождите, если вы очищаете экран, разве вы не использовали бы только php?

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

4. Кажется, я понимаю, что вы делаете. У вас есть php-программа, которая удаляет изображения с сайта и отправляет их в браузер с помощью ajax-вызова.

5. Ну, он отправляет их во временный каталог, который позже будет заархивирован для загрузки пользователем, но в принципе то же самое. Мне нравится идея @ jason ниже о том, чтобы позволить странице запускаться без возвращаемого результата (звучит опасно), а затем опрашивать мою базу данных mysql о том, сколько было обработано из 1000. The export_images.php имеет резервную копию для любых проблем во время выполнения скрипта, поэтому он повторит попытку для любых необработанных изображений, изображений, которые иногда возвращаются с 0 байтами и т.д.

Ответ №2:

Вероятно, вы захотите использовать таймер jquery для повторного вызова страницы, чтобы она могла обрабатывать все изображения.

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

1. Я предполагаю, что таймер был бы плохим вариантом, поскольку вы не знаете, когда страница завершит обработку, чтобы начать следующую.

2. то есть при каждой загрузке страницы обрабатывается еще 20 изображений? Я думаю, вы могли бы включить на страницу некоторую логику, которая возвращает количество обработанных изображений, и, если 20 закончены, запустите другой пакет. я думаю, вам нужен какой-то цикл для вызова страницы для загрузки следующего пакета, но, не видя кода, сложно сказать. в качестве альтернативы, если загрузка одной страницы запускает пакет для всех 1000, вам может понадобиться другая страница, которая может просто возвращать количество изображений, которые были обработаны на данный момент, которые вы могли бы опросить через ajax.

3. Мне нравится эта идея, я собираюсь протестировать ее и посмотреть, как это работает. Я думаю, что мог бы также попробовать идею выше, о циклическом выполнении функции, которая при успешном выполнении выполняет еще 20 изображений до завершения.