Асинхронность в PHP. Отдать ответ клиенту и продолжить выполнение скрипта.

Иногда требуется продолжить выполнение php скрипта, после отдачи HTTP ответа(вывода) клиенту. Т.е. задача чтобы клиент «отвалился» не ожидая полного выполнения кода, но сам код должен продолжить работать.

Зачастую это могут быть ajax запросы, код юзающий curl, хотя не обязательно. Просто любой долго выполняемый код. Во-первых если используются сессии, сессию нужно закрыть с сохранением, про session_write_close() уже говорилось.

Собственно пример кода:

<?php

ob_start(); // включаем буферизацию вывода
session_start(); // стартуем сессию(если нужна)

/* тут некий код наш */

echo 'Goodbye my friend!'; // пишем нечто в буфер

session_write_close(); // записываем сессию с сохранением
set_time_limit(0); // делаем лимит времени выполнения бесконечным(не обязательно)
ignore_user_abort(true); // игнорим что клиент отвалился и продолжаем работу
header('Connection: close'); // посылаем заголовок клиенту, чтобы он отвалился
header('Content-Length: ' . ob_get_length()); // посылаем количество байт
ob_end_flush(); // сбрасываем самый верхний буфер вывода
flush(); // сбрасываем системный буфер и отправляем
fastcgi_finish_request(); // сброс данных запроса клиенту(в случае php-fpm необходимо!)

/*
тут некий дальнейший код, он продолжит выполнение уже после закрытия связи с клиентом
*/

Оставить ответ

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