Ответ сервера во время цикла (обновление статуса) - PullRequest
0 голосов
/ 30 января 2019

Я написал функцию ajax для вызова скрипта, который создает zip-архив из 500 файлов.Есть цикл для добавления файлов в архив.Этот цикл содержит файловый счетчик.Теперь я хочу обновлять статус в браузере каждые 50 файлов.Но php-скрипт отправит весь вывод, когда скрипт завершится и zip-файл будет завершен.

Принцип очень похож на следующий пост: Вывод 'string' во время каждой итерации длинного цикла (flush() не работает)

(за исключением того, что решение не работает на моем сервере)

Я нашел много возможных решений, но ничего не работает ...

Я попробовал это с помощью метода flush / ob_flush (также ob_implicit_flush), но сбросить содержимое у меня не работает.Я немного поиграл с настройкой сервера, но это не помогло.Также все примеры не сработали.Возможно, проблема с сервером.

Я попробовал SSE, но следующий ответ завершился успешно и после завершения сценария.

Я попытался использовать WebSocket, но у меня были некоторые проблемы с рукопожатием.

Код может выглядеть следующим образом

$filecounter = 0;
foreach ($files as $file) {
  // add $file to zip archive
  $filecounter++;
  if ($filecounter % 50 == 0) {
    echo $filecounter;
  }
}

Есть ли другие варианты, чтобы заставить это работать?Или как я могу получить код «сброшен»?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 31 января 2019

Вы можете сохранить прогресс в сеансе и использовать второй ajax-вызов для отслеживания прогресса:

$filecounter = 0;
foreach ($files as $file) {
  // add $file to zip archive
  $filecounter++;
  if ($filecounter % 50 == 0) {
    session_start();
    $_SESSION['progress'] = $filecounter;
    session_write_close();
  }
}

Вам нужно session_write_close();, чтобы сделать Session var доступным для второго скрипта.

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