Отправка ответа пользователю без завершения работы основного скрипта

Отправка ответа пользователю без завершения работы основного скрипта

Когда я был маленьким, то все мои сайт работали последовательно. С одной стороны все было отлично, но иногда код скриптов должен выполнить очень трудоемкие задачи. На выполнение таких задач уходит время и пользователю приходится все это время ждать пока ему будут отправлены данные. Согласитесь, что вам не хочется ждать 20-40 секунд пока начнет загружаться страница.

Однако сейчас в этом плане ситуация изменилась. Если на сервере скрипты работают под управлением php-fpm, то существует возможность отправить ответ пользователю без завершения нормальной работы скрипта.

Речь идет о функции fastcgi_finish_request(). Что же это за такая замечательная функция? Данная функция отправляет данные на клиент, но скрипт продолжает свою нормальную работу.

Если быть точным то, данная функция отправляет все данные, находящиеся в буфере вывода на клиентскую сторону, после чего соединение сервера и клиента разрывается, а сам скрипт продолжает свою работу. Организовывать такую работу скрипта имеет смысл в случае с трудоемких операций, чтобы не задерживать пользователя. Пользователь продолжает работу с вашим сайтом, а сервер в фоновом режиме доделывает трудоемкую операцию.

Необходимость применения fastcgi_finish_request() при трудоемких операциях

Представьте себе, что по выполнении пользователем каких-то действий скрипту предстоит разослать почту, сделать какие-то запросы на сторонние серверы и обработать ответы на эти запросы, или вообще перекодировать видеоролик. Каждая из этих операций может выполняться от нескольких десятков секунд до нескольких часов. Иногда для выполнения таких задач, проще организовать очередь обработки, а в некоторых случаях можно воспользоваться функцией fastcgi_finish_request.

Алгоритм применения функции

  1. Выполнение основного кода необходимого для формирования ответа пользователю.
  2. Вызов в нужной части кода функции fastcgi_finish_request().
  3. Медленная часть кода вашего приложения, которая будет выполнена в фоновом режиме. Результат работы данного кода никак не должен влиять на ответ пользователю.

При необходимости показать пользователю результат выполнения медленного куска кода последний разделяется на 2 части: Формирование запроса, приме данных от пользователя с ответом “Ждите, ваш запрос обрабатывается” и вторая часть, уведомляющая пользователя о результатах обработки скрипта.

Завершим рассказ примером

Вы отправляете почту, отправка может занимать довольно продолжительное время. Обычно, в таких случаях пользователь ждет завершения отправки письма, прежде чем получить ответ в браузер:

Если же воспользоваться указанной функцией, то пользователь может получить ответ практически мгновенно. Для этого код надо модифицировать примерно так:

Важным моментом при работе с данной функцией является то, что сессии должны быть закрыты до вызова fastcgi_finish_request().

Казалось ба такие незначительные перемены, но в некоторых случаях вы можете повысить скорость ответа сайта в разы.

Нет комментариев.
Добавить комментарий
Вам необходимо включить показ изображений в браузере для того чтобы увидеть код

Дайте нам знать, что вы - живой человек. Для нас это важно!
Кликните, если плохо видно

Прежде чем высказать свое мнение, прочитайте пожалуйста: правила

Рейтинг@Mail.ru