
У вас когда-нибудь был долгий процесс с несколькими шагами на бэкенде, и вы не могли просто вызвать ответ у пользователя, чтобы он точно знал, что вы делаете? Конечно, вы можете использовать сокеты и фреймы, но это делает вещи более сложными, чем они должны быть.
Для этого вам потребуется выполнить два одновременных вызова AJAX на сервер. Тот, который вызывает основной процесс, а затем тот, который проверяет процесс. Конечно, процесс может обновить таблицу со статусом того, что он обрабатывает («запущено», «загрузка изображения», «обрезка изображения», «добавление водяного знака» и т. д.), но проблема заключается в том, что когда вы запускаете любой процесс, все остальные процессы зависают до тех пор, пока не завершится первый.
Многие создали библиотеки и инструменты, чтобы помочь в этом, запуская параллельные процессы через сокеты, iframe или другие методы. Что, если бы я сказал вам, что вам не нужно добавлять какую-либо новую библиотеку. И решение НЕ находится на переднем крае. Решение находится на задней панели.
Основная причина, по которой вы не можете вызвать новый процесс, заключается в том, что когда сервер выполняет функцию, он блокирует сеанс. Хм? Ага. Как только процесс запускается, он блокирует сеанс в браузере, и никакие другие процессы не могут работать, пока первый не завершит разрыв сеансового соединения.
Что, если бы существовал способ освободить эту сессию? Что ж, я предпочитаю PHP, так как на нем работает почти 80% веб-сайтов в Interwebs Land (на момент написания этой статьи).

И да, в PHP есть простая функция, которая закрывает сеанс, чтобы вы могли продолжить выполнение оставшейся части скрипта, не блокируя новые запросы, поступающие из того же браузера. Имя функции:
сессия_write_close();
Подробности смотрите на php.net: https://www.php.net/manual/en/function.session-write-close.php
Судя по всему, он работает на версиях PHP выше 4.
«(PHP 4 ›= 4.0.4, PHP 5, PHP 7)»
Но что, если мне нужно использовать объект $_SESSION в скрипте?
Ну, вы можете просто сохранить переменные объекта сеанса, необходимые в пользовательских переменных PHP, прежде чем вызывать функцию. Пример:
$user_id = $_SESSION['user_id'];
session_write_close();
// запускаем скрипт
// обновляем базу данных с новым статусом
// запускаем другой скрипт
// обновить базу данных с другим статусом.
// вспенить, промыть, повторить
А во внешнем интерфейсе просто есть функция таймера, которая проверяет базу данных на наличие нового статуса. Вы можете сделать это с помощью JS или использовать jQuery, если хотите, чтобы все было проще.
function check_stuff() {
setTimeout(function() {
$.ajax({url: '/etc', success() {
check_stuff();
}}) ;
}, 2500);
}
Это работает… Раннее закрытие сеанса позволяет пройти любым дополнительным вызовам AJAX. И, если вы хотите стать хардкорнее, сделайте то же самое для функции «check_stuff». На случай, если сервер зависнет на чеке, закрытие сессии сразу после вызова функции освободит ресурсы для дополнительных вызовов.
Вероятно, было бы полезно добавить ограничение по времени для вызова AJAX и отменить процесс в случае ошибки.
Я надеюсь, что это поможет вам, ребята, в Стране веб-разработчиков, потому что я всегда знал, что есть простое решение для загрузки полос, панели процессов и т. д.
Как насчет полос загрузки?
Я предполагаю, что для создания «панели загрузки загрузки» все, что вам нужно сделать, это начать загрузку с помощью «session_write_close», получить исходный размер файла при отправке, а затем проверять размер файла при каждом вызове AJAX.