Страницы

Поиск по вопросам

суббота, 16 марта 2019 г.

Прогресс бар долгого скрипта на ajax

Есть долгий скрипт на сервере который запускается через ajax, пытаюсь сделать для него прогрессбар. Скрипт на сервере запускается
session_start(); $_SESSION['process']=0; session_write_close();
Что то там делает в процессе
foreach ($clear as $key => $array) { $_SESSION['process'] = round(($key * 100 / $count)/2); session_write_close(); //бла бла }
Вторым запросом опрашиваю другой файл скрипта на сервере
session_start(); $array = array('process'=>$_SESSION['process']); echo json_encode($array);
Но вот беда не работает так как хотелось бы, данные не обновляющийся, а если в цикле добавить session_start(); то обновляются где то раз 50 и потом ошибка валит
net::ERR_RESPONSE_HEADERS_TOO_BIG
Нашел ответ https://stackoverflow.com/questions/17186675/why-i-get-err-response-headers-too-big-on-chrome header_remove ("Set-Cookie");
Читал на хабре в комментах писали что так не стоит делать, дабы вопросу не пропадать, как стоит делать?


Ответ

Наиболее простой вариант, который напрашивается исходя из вашей текущей архитектуры - писать % во временный файл, из него читать 2м скриптом, удалять его по окончании срипта.
Более красивое решение:
Страница с ajax:

Выполнено: 0%


Серверный скрипт
header("Content-type: text/plain"); header("Content-Length: 10000");
$parcel = str_repeat('.', 1000); // 1000 байт - 10%
for ($i = 0; $i < 10; $i++) {
$tmp = time() + 0.1; while (time() < $tmp); echo $parcel; flush(); // выталкиваем буфер браузеру ob_flush(); // выталкиваем буфер браузеру }
Идея: выдаем ответ по частям, сразу очищая буфер и передавая данные браузеру, а в ajax скрипте обрабатываем событие progress. В заголовке передаем количество байт, оно попадет в e.total в ajax скрипте. Отправляем ответ точками (байтами), а не числом, так как Chrome видимо сильнее буферизирует ответ и не возбудит событие progress в XMLHttpRequest пока не получит достаточное число байт (кстати оно даже больше 1000, так как начинает в Chrome с 20%, а в Mozille c 10%, в Mozille и числами можно).

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

Отправить комментарий