Рейтинг обговорення:
  • 0 Голосів - 0 Середнє
  • 1
  • 2
  • 3
  • 4
  • 5

Магія PHP: Як повернути відповідь клієнту і продовжути роботу у фоні
#1
Wink 

Привіт усім! Сьогодні хочу поділитися невеликим, але потужним лайфхаком для PHP-розробників.

Часто буває ситуація: користувач натискає кнопку, і нам треба запустити якийсь важкий процес (наприклад, відправка імейлів, генерація великого звіту або запит до стороннього API), але ми не хочемо змушувати користувача чекати 10-20 секунд, поки скрипт завершиться.

В PHP є чудова функція fastcgi_finish_request(), яка дозволяє миттєво віддати відповідь клієнту (браузер отримає статус 200 і закриє з'єднання), але при цьому скрипт продовжить виконуватися далі на сервері.

Ось як це виглядає:
Код:
if (function_exists('fastcgi_finish_request')) {     fastcgi_finish_request(); // Віддає відповідь клієнту і продовжує виконання } else {     // Альтернатива для звичайного Apache/PHP-FPM     ignore_user_abort(true);     flush(); } // Тут починається важка магія, яку юзер вже не чекає sleep(10); file_put_contents('log.txt', 'Job done at ' . date('H:i:s'));

Важливий нюанс: якщо ви використовуєте звичайний Apache без FastCGI, то fastcgi_finish_request не буде існувати. У такому разі можна спробувати комбінацію ignore_user_abort(true) та flush(), хоча це не завжди гарантує, що з'єднання закриється негайно (залежить від налаштувань сервера та буферизації).
Cool  Як перевірити, чи вона у вас є?
Код:
if (function_exists('fastcgi_finish_request')) {     echo "Функція доступна!"; } else {     echo "Функція не підтримується на цьому сервері."; }

Хтось використовує такий підхід у проектах? Чи ви віддаєте перевагу чергам (RabbitMQ/Redis)?

PHP Developer | Laravel | Symfony | Docker
Відповідь


Перейти на форум:


Користувачі, які переглядають цю тему: Гостей: 1