Есть долгий скрипт на сервере который запускается через 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 и числами можно).
Комментариев нет:
Отправить комментарий