Если ваша задача состоит в том, чтобы загрузить огромный набор данных или обработать его на сервере, при обновлении прогресса на сервере вам следует рассмотреть возможность использования какой-либо архитектуры заданий, при которой вы запускаете задание и выполняете его с помощью другого сценария. запуск на сервере (например, масштабирование / обработка изображений и т. д.). При этом вы делаете одну вещь за раз, таким образом формируя конвейер задач, где есть входные данные и конечный обработанный выходной результат.
На каждом шаге конвейера состояние задачи обновляется внутри базы данных, которая затем может быть отправлена пользователю любым механизмом серверного проталкивания, существующим в наши дни. Запуск одного скрипта, который обрабатывает загрузки и обновления, увеличивает нагрузку на ваш сервер, а также ограничивает вас (что если браузер закроется, что если произойдет какая-то другая ошибка). Когда процесс разделен на этапы, вы можете возобновить невыполненную задачу с того места, где она была выполнена последней.
Существует много способов сделать это. Но общий процесс выглядит следующим образом

Следующий метод - это то, что я сделал для личного проекта, и этот скрипт был хорош для загрузки и обработки тысяч изображений высокого разрешения на мой сервер, которые затем были уменьшены до нескольких версий и загружены в amazon s3 при распознавании объектов внутри них. (Мой оригинальный код был на python)
Шаг 1:
Инициировать перенос или задачу
Сначала загрузите свой контент, а затем сразу же верните идентификатор транзакции или uuid для этой транзакции с помощью простого запроса POST. Если вы выполняете в задаче несколько файлов или несколько вещей, вы можете также обработать эту логику на этом шаге
Шаг 2:
Сделай работу и верни прогресс.
Как только вы выяснили, как происходят транзакции, вы можете использовать любую технологию push на стороне сервера для отправки пакета обновления. Я бы выбрал WebSocket или Server Sent Events, в зависимости от того, что применимо, к «длинному опросу» в неподдерживаемых браузерах. Простой метод SSE будет выглядеть следующим образом.
function TrackProgress(upload_id){
var progress = document.getElementById(upload_id);
var source = new EventSource('/status/task/' + upload_id );
source.onmessage = function (event) {
var data = getData(event); // your custom method to get data, i am just using json here
progress.setAttribute('value', data.filesDone );
progress.setAttribute('max', data.filesTotal );
progress.setAttribute('min', 0);
};
}
request.post("/me/photos",{
files: files
}).then(function(data){
return data.upload_id;
}).then(TrackProgress);
На стороне сервера вам нужно будет создать что-то, что будет отслеживать задачи, достаточно простой архитектуры Jobs с job_id и прогрессом, отправляемым в базу данных. Я бы оставил планирование работы вам и маршрутизацию, но после этого концептуальный код (для простейшего SSE, которого будет достаточно вышеуказанного кода) выглядит следующим образом.
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
/* Other code to take care of how do you find how many files are left
this is really not required */
function sendStatusViaSSE($task_id){
$status = getStatus($task_id);
$json_payload = array('filesDone' => $status.files_done,
'filesTotal' => $status.files_total);
echo 'data: ' . json_encode( $json_payload ) . '\n\n';
ob_flush();
flush();
// End of the game
if( $status.done ){
die();
}
}
while( True ){
sendStatusViaSSE( $request.$task_id );
sleep(4);
}
?>
Хороший учебник по SSE можно найти здесь http://html5doctor.com/server-sent-events/
и вы можете узнать больше о загрузке обновлений с сервера по этому вопросу Отправка обновлений с сервера
Выше было концептуальное объяснение, есть и другие способы достичь этого, но это было решение, которое позаботилось о довольно большой задаче в моем случае.