PHP программирование → Асинхронность с помощью fastcgi_finish_request()
При оптимизации приложения важно не забывать о том, что оптимизируем мы прежде всего для клиента. Сайт, который работает медленно, это всегда неудобно и плохо.
Главный критерий оптимизации для клиента — это скорость ответа (т.е. время, за которое Web сервер отвечает на запрос). Если не брать во внимание клиентскую оптимизацию, есть ряд практик, позволяющих быстрее генерировать ответ клиенту (по сути без оптимизации внутренностей).
Одна из распространенных практик — это переводить необязательную для ответа часть логики в асинхронную обработку. Для этой задачи применяются очереди сообщений.
Если Вы счастливый обладатель связки PHP + PHP-FPM, то существует более простой (хотя и несколько ограниченный) подход для реализации асинхронности. После сборки патча php-fpm, Вам станет доступна функция:
После ее вызова из скрипта, php-fpm получает сигнал о завершении запроса (т.е. отправляет ответ Web серверу), но сам скрипт не завершается. Т.е. вся логика, которая находится после вызова этой функции будет выполнена на фоне.
Для примера рассмотрим задачу отправки письма (зачастую, весьма медленный процесс):
Это самый простой пример, но, как видно, затраты на внедрение этого ощутимого улучшения минимальны. Другие примеры: загрузка фото с последующим ресайзингом, загрузка видео с последующей конвертацией, отправка сообщения всем друзьям (либо просто нескольким людям) и т.п.
Вам приходилось пользоваться fastcgi_finish_request(), и если да, то в каких случаях?
Главный критерий оптимизации для клиента — это скорость ответа (т.е. время, за которое Web сервер отвечает на запрос). Если не брать во внимание клиентскую оптимизацию, есть ряд практик, позволяющих быстрее генерировать ответ клиенту (по сути без оптимизации внутренностей).
Одна из распространенных практик — это переводить необязательную для ответа часть логики в асинхронную обработку. Для этой задачи применяются очереди сообщений.
Если Вы счастливый обладатель связки PHP + PHP-FPM, то существует более простой (хотя и несколько ограниченный) подход для реализации асинхронности. После сборки патча php-fpm, Вам станет доступна функция:
fastcgi_finish_request();
После ее вызова из скрипта, php-fpm получает сигнал о завершении запроса (т.е. отправляет ответ Web серверу), но сам скрипт не завершается. Т.е. вся логика, которая находится после вызова этой функции будет выполнена на фоне.
Для примера рассмотрим задачу отправки письма (зачастую, весьма медленный процесс):
$to = $_POST['to'];
$body = $_POST['body'];
$subject = $_POST['subject'];
if ( $to && $body && $subject )
{
echo 'Ваше письмо успешно отправлено';
# После этой инструкции посетителю уйдет ответ
fastcgi_finish_request();
# Сама отправка будет выполнена на фоне
mail($to, $subject, $body);
}
else
{
echo 'Вы не ввели все необходимые данные';
}
$body = $_POST['body'];
$subject = $_POST['subject'];
if ( $to && $body && $subject )
{
echo 'Ваше письмо успешно отправлено';
# После этой инструкции посетителю уйдет ответ
fastcgi_finish_request();
# Сама отправка будет выполнена на фоне
mail($to, $subject, $body);
}
else
{
echo 'Вы не ввели все необходимые данные';
}
Это самый простой пример, но, как видно, затраты на внедрение этого ощутимого улучшения минимальны. Другие примеры: загрузка фото с последующим ресайзингом, загрузка видео с последующей конвертацией, отправка сообщения всем друзьям (либо просто нескольким людям) и т.п.
Вам приходилось пользоваться fastcgi_finish_request(), и если да, то в каких случаях?





