Асинхронность в PHP и FPM

admin

Если Вы используете PHP-fpm, Вам доступна очень удобная возможность выполнять код асинхронно. Функция fastcgi_finish_request() позволяет отправить Web серверу ответ без остановки самого PHP скрипта.

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

Структура

Чтобы использовать возможность фонового окончания PHP программы, необходимо, чтобы она имела такую структуру выполнения:

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

Иногда, если пользователю необходимо показать результат какой-то очень медленной операции, лучше разделить ее на части. Например, при загрузке и преобразовании видео-ролика:

  1. Возврат ответа сразу после загрузки “Спасибо, видео обрабатывается”.
  2. Выполнить на фоне обработку и обновить статус этого ролика в БД.

Пример

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

$to = $_POST['email'];
if ( $to )

{
mail($to, 'Подтверждение', 'Это Ваш ящик?');
echo 'Подтверждение было отправлено на почту';
}

else
{
echo 'Вы не ввели все необходимые данные';
}

Если человек введет email, ему придется ожидать пока письмо будет отправлено

Используя fastcgi_finish_request() можно легко превратить этот код в быстрый:

$to = $_POST['email'];
if ( $to )

{
echo 'Подтверждение было отправлено на почту';
fastcgi_finish_request();
mail($to, 'Подтверждение', 'Это Ваш ящик?');
}

else

{
echo 'Вы не ввели все необходимые данные';
}

После вызова fastcgi_finish_request() посетитель сразу увидит ответ от сервера

Сессии

Если Вы используете сессии, их необходимо закрывать перед использованием этой функции:

...
session_write_close();
fastcgi_finish_request();

Самое важное

Простой механизм асинхронной работы с помощью fastcgi_finish_request() поможет значительно ускорить ответ сайта без необходимости его оптимизации.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023