PHP программирование →  Асинхронность с помощью 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 'Вы не ввели все необходимые данные';
}

Это самый простой пример, но, как видно, затраты на внедрение этого ощутимого улучшения минимальны. Другие примеры: загрузка фото с последующим ресайзингом, загрузка видео с последующей конвертацией, отправка сообщения всем друзьям (либо просто нескольким людям) и т.п.

Вам приходилось пользоваться fastcgi_finish_request(), и если да, то в каких случаях?
1


Вставка изображения
Файл:
Ссылка:
Выравнивание:
Описание:
комментарии(2): 
qubit 22 декабря 2009, 13:05 #
2 
Интересено.
fastcgi_finish_request() закончит загрузку страницы и у клиента появится «Ваше письмо успешно отправлено»? Но на самом деле, php скрипт ещё работает и ещё только готовится отправить сообщение. Я правильно понял?
Что если для этих целей использовать AJAX?
gonandriy 17 января 2010, 14:02 #
2 
fastcgi_finish_request() разривает соединение с браузером клиента?

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии. Авторизуйтесь, пожалуйста, или зарегистрируйтесь, если не зарегистрированы.