Вы можете (хотя это и не является строго необходимым шагом) использовать AJAX для создания экземпляра вызова, а затем сценарий может создать ссылку на состояние фонового задания в разделяемой памяти (или даже временную запись в таблице SQL, или даже временный файл), в виде уникального идентификатора задания.
Затем сценарий может запустить ваш фоновый процесс и немедленно вернуть идентификатор задания клиенту.
Затем клиент может повторно вызывать сервер (например, через другой интерфейс AJAX) для запроса статуса задания, например, "в процессе", "завершено".
Если выполняемый фоновый процесс сам по себе написан на PHP (например, PHP-скрипт командной строки), вы можете передать ему идентификатор задания, и он может предоставить значимые обновления прогресса клиенту (записав в тот же общий ресурс). область памяти или таблица базы данных).
Если выполняемый процесс сам по себе не написан на PHP, тогда я предлагаю обернуть его в PHP-скрипт командной строки, чтобы он мог отслеживать, когда выполняющийся процесс завершился (и проверить вывод, чтобы убедиться, что он прошел успешно) и соответствующим образом обновите запись статуса для этой задачи.
Примечание. Использование общей памяти для этого рекомендуется, но может быть недоступно, например, если вы используете общий хостинг. Не забывайте, что вы хотите иметь средство для очистки старых записей о состоянии, поэтому я буду хранить значения меток времени «start_on» / «complete_on» для каждого и удалять из него записи для устаревших данных (например, имеющих метку времени complete_on более X минут - и, в идеале, это также проверяет задания, которые были начаты некоторое время назад, но никогда не отмечались как выполненные, и оповещает о них).