Требование:
Мне нужно запустить фоновый процесс (по запросу пользователя), который занимает от 30 до 60 секунд. Я хотел бы дать пользователю обратную связь о состоянии. Примечание. Толи прав, "Фон" не требуется.
Что работает:
За это время процесс выводит около 20 сообщений о состоянии, и я извлекаю их с помощью proc_open и прослушиваю канал чтения с помощью fgets. Я могу сохранить эти сообщения в переменную сеанса и, используя временные метки (для помощи в отладке), я вижу, что массив сеансов записывается с этими сообщениями по мере выполнения процесса.
Проблема:
Мой план состоял в том, чтобы опросить сервер вызовами ajax (каждую секунду), чтобы получить эти переменные сеанса для отображения в DOM. Узким местом, по-видимому, является то, что сервер не может обслуживать запрос ajax, пока он все еще работает в фоновом режиме. Все сбрасывается сразу после завершения фонового процесса. Из того, что я могу сказать, проблема не в буферизации вывода, потому что использование (отладка) временных меток, сохраненных с каждым сообщением процесса, показывает, что сервер последовательно записывает в переменную сеанса, поэтому я знаю, что чтение proc_open и pipe работает, как я ожидаю . Похоже, что проблема заключается в том, что сервер не может предоставить AJAX-запросу свой объект JSON, пока он не будет выполнен с процессом; или, возможно, точнее, с циклом, который читает канал.
Очевидное заблуждение:
Я думал, что отправка процесса в фоновый режим (используя &) может дать мне решение здесь. Видимо я не знаю разницы между фоновым процессом и разветвленным процессом. Какая польза от запуска процесса в фоновом режиме, если это не имеет для меня никакого значения в этом сценарии?
Возможные решения:
- Я не ожидаю, что инициированный пользователем процесс, который запускает этот процесс/сценарий, будет таким тяжелым, но если есть что-то, что я могу встроить в это решение, что помогло бы при большой нагрузке, то я хотел бы сделать это сейчас.
- Является ли это многопоточным (pthreads) или многопроцессорным (fork) решением?
- Или мне следует сохранить идентификатор процесса, отпустить его опрос с помощью инструкции while( .. fgets ..), а затем вернуться к процессу после того, как сервер обслужит запрос ajax?
- Я полагаю, что мог бы запустить поддельные сообщения о состоянии, а затем точно ответить, когда результаты вернутся после завершения. Время обработки запроса не зависит от пользователя, поэтому мой поддельный тайминг может быть довольно точным. Тем не менее, я хотел бы знать, каким будет решение для обеспечения обратной связи в режиме реального времени.