запрос 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(); работал, и страница пользователя больше не блокируется.