Если Вы используете PHP-fpm, Вам доступна очень удобная возможность выполнять код асинхронно. Функция fastcgi_finish_request() позволяет отправить Web серверу ответ без остановки самого PHP скрипта.
Т.е. выполнение программы никак не изменяется, а сама функция сбрасывает буфер вывода и закрывает соединение с Web сервером. Сервер в свою очередь все это шлет клиенту. Удобная возможность выполнить медленные операции на фоне без существенных изменений в программе.
Структура
Чтобы использовать возможность фонового окончания PHP программы, необходимо, чтобы она имела такую структуру выполнения:
- Главная часть кода, который обязательно нужен для отправки ответа пользователю.
- Вызов fastcgi_finish_request().
- Тяжелая часть, которая будет выполнена на фоне и не содержит никакой логики, которая влияет на ответ.
Иногда, если пользователю необходимо показать результат какой-то очень медленной операции, лучше разделить ее на части. Например, при загрузке и преобразовании видео-ролика:
- Возврат ответа сразу после загрузки "Спасибо, видео обрабатывается".
- Выполнить на фоне обработку и обновить статус этого ролика в БД.
Пример
Отправка почты часто может занимать несколько секунд. В классическом случае, пользователь должен будет подождать это время, пока не увидит ответ:
<?
$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() поможет значительно ускорить ответ сайта без необходимости его оптимизации.