Асинхронное выполнение кода PHP (нет)

В книге «Symfony 5. Быстрый старт» есть хороший пример, когда нам надо выполнить какие то долгие действия  (отправить почту, вызвать сторонний API) но не заставлять пользователя ждать. Для этого используется очередь. Мы в очередь записываем действие, сразу отправляем ответ пользователю а дальше уже, в другом скрипте делаем задачи из очереди.

Но если по каким то причинам, вы не можете поставить rabbitmq или вам это будет «ДОРОГО», считай излишни, можно обойтись таким асинхронным выполнением. Суть его в том, что все действия делаем быстро, отдаем ответ клиенту, а потом уже, когда он отключился, продолжаем выполнять свои задачи:

<?php

// Игнорирует отключение пользователя 
ignore_user_abort(true);
//позволяет скрипту быть запущенным постоянно
set_time_limit(0);

// старт буфиризации
ob_start();
// вывести результат в буфер
echo $result;
$length = ob_get_length();


header('Connection: close');
header("Content-Length: " . $length);
header("Content-Encoding: none");
header("Accept-Ranges: bytes");
// отключаем буфиризацию
ob_end_flush();
// сбросить (отправить) буфер вывода
ob_flush();
// сброс системного буфера вывода
flush();


// а вот тут уже делаем все остальное

По такому принципу у меня работает Telegram бот, он на входе принимает сообщение с внешнего источника, и тут же отключает этот источник от себя, а уже дальше отправляет сообщение в телегу

Добавить комментарий

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

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>