PHP ignore_user_abort не работает в IIS 10

#php #ajax #apache #iis #fastcgi

#php #ajax #apache #iis #fastcgi

Вопрос:

Я хочу выполнить PHP-запрос, даже если сеанс Ajax закрыт со стороны пользователя. Мне удается сделать это на Apache, добавив ignore_user_abort(True) в свой php-файл, но он не работает в IIS 10 с FASTCGI. безуспешно пытался найти какое-либо решение в Google. Я использую PHP версии 7.4 и IIS версии 10 на Windows server 2019.

ниже приведен только тестовый код для открытия файла и вывода состояния соединения. он отлично работает в Apache, но в IIS он перестает писать, когда сеанс закрыт.

 <?php
ignore_user_abort ( TRUE );
echo "hellon";

$x=0;
$log_filename = ".\test.txt";
while (@ ob_end_flush());
while ($x<100)
{
  echo($x ."n");
  $status = connection_aborted();
  file_put_contents($log_filename, $x ." - " .$status ."n", FILE_APPEND);
  $x  ;
  @ flush();
  sleep(1);
}
?>
  

Комментарии:

1. Похоже, это старая ошибка (с 2011 года): bugs.php.net/bug.php?id=60586#1378935714 . Тем не менее, он по-прежнему помечен как открытый.

2. @Magnus я видел эту ошибку, но это было для версии 5.3, я использую версию 7.4

3. Да, но проблема может быть все той же. Последний комментарий с той же проблемой был с 2017 года.

Ответ №1:

Вы можете попробовать использовать fastcgi_finish_request() эту функцию, которая сбрасывает все данные ответа клиенту и завершает запрос. Это позволяет выполнять трудоемкие задачи, не оставляя соединение с клиентом открытым.

https://www.php.net/manual/en/install.fpm.php

Комментарии:

1. Спасибо за ваш ответ, но я не хочу закрывать соединение, поскольку я возвращаю данные во время работы. Основная цель здесь — вернуть пользователю текущие данные, и если он закроет вкладку или браузер, скрипт продолжит работу до конца.