SkaN2412
@SkaN2412
Программист, но хороший человек.

Как отправить ответ на AJAX запрос раньше окончания выполнения скрипта PHP?

Есть такая ситуация: по заполнению одной формы должно отправляться письмо с тремя вложениями. Из-за толщины канала оно уходит около 10 минут, т.е. ждать ответа нет возможности. Однако клиент должен что-то видеть. Ответ также нужен потому что есть проверка на корректность введенных данных.
Сейчас это сделано так: аякс запрос имеет таймаут, после которого просто выводится сообщение о том, что все хорошо. Если ответ пришел раньше, то его ловит обработчик success и там уже смотрит.
  • Вопрос задан
  • 3129 просмотров
Решения вопроса 1
@kazmiruk
Можете использовать fastcgi_finish_request, если на сервере у вас стоит php-fpm. Его суть в том, что скрипт висит еще некоторое время (пока не выполнятся все операции) после ответа клиенту. Но это неправильный путь. Вреное решение будет примерно такое: вы присылаете аякс, валидируете данные, добавляете в очередь сообщений (я люблю gearman, но вы можете использовать любую другую) запись, что надо отправить письмо. Как только в очередь добавляется запись обработчик хватает его и отправляет.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
nekt
@nekt
программист
Чисто по логике построения интерфейсов, безотносительно к используемым технологиям, это неправильно - сообщать об успехе до того, как успех собственно произошел. На мой взгляд разумнее всего принимать сообщение от пользователя, валидировать его и ставить в отдельную очередь исполнения с тем-же идентификатором. После этого этапа отправлять сообщение пользователю, мол все ок, обрабатывается. Или же сообщение об ошибке. В идеале же стоит еще и прогнозировать время выполнения задачи и сообщать об этом пользователю. Когда же сообщение отправлено, всплывающим ли окошком ли, прямо в этой форме ли, об этом стоит сообщить отдельно... Если оно надо, конечно.
Ответ написан
Комментировать
ZloyHobbit
@ZloyHobbit
curl
А вообще комментарий выше правильный.
Ответ написан
Комментировать
Если с очередями лениво возиться можно просто записывать куда-нибудь в таблицу и по крону раз в сколько-нибудь минут отправлять все не отправленные письма. Правда, если поток большой могут быть проблемы.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы