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

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

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

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

Похожие вопросы