запрос FastCGI finish создает зависшее соединение при наличии открытого сеанса
у меня есть клиентская сторона, которая отправляет запрос, который требует длительного времени обработки, клиент отправляет запрос в ajax. Как только запрос принимается на сервере, клиент перенаправляется на другую страницу, это выполняется fastcgi_finish_request (я запускаю php-fpm)
LongWork.на PHP:
<?php
fastcgi_finish_request();
sleep(1000); //Simulate long computation time
?>
клиент.js:
$.ajax({
url: "...",
data: {},
success: function() {
top.location.href="next_page.php"
}
});
ajax отправляется, и обратный вызов успеха вызывает перенаправление на next_page.php как и ожидалось.
но тогда страницы останавливается, и я не получаю никакого обслуживания, пока сон не закончится. Похоже, что мое соединение ждет то же самое php-fpm процесс для завершения
я запускаю nginx с php-fpm, есть идеи, почему это происходит?
редактировать:
после дополнительного исследования я обнаружил, что причиной такого поведения является то, что у меня есть активный сеанс (из Facebook SDK), когда я уничтожаю сеанс на LongWork.на PHP:
<?php
session_destroy(); // Session was halting the client from accessing another page
fastcgi_finish_request();
sleep(1000); //Simulate long computation time
?>
пожалуйста, вы можете задуматься над этим решением?
должен ли я делать что-то отличное от session_destroy()
EDIT:
после комментария Лахлана Пиза я переключился session_destroy
С session_write_close
2 ответов
проблема заключалась в существовании сеанса, см. изменения в вопросах для получения более подробной информации
Я также сталкиваюсь с этой проблемой, Я регистрирую функцию для запуска register_shutdown_function, и функция begin, которая fastcgi_finish_request, в то время как я нашел скрипты после fastcgi_finish_request() все еще блокирует страницу пользователя, в то время как put session_destroy(); впереди fastcgi_finish_request(); работал, и страница пользователя больше не блокируется.