Задать вопрос

Как в nginx передать header("Connection: close"), когда включено keep-alive?

Добрый день, у меня есть php код, который получает POST запрос, выполняет примерно такие действия:
1. Проверят валидность пришедших данных
2. Занести данные в базу
3. Рассылает 5-ть писем (администраторы, менеджеры) с тем, что мол пришла новая заявка
4. На amoCRM тоже что-то отсылает
5. Возвращает JSON данные для всплывающего окна, мол "Ваша заявка успешно принята".

Проблема в том, что пункты 3 и 4 выполнятся около 5-8 секунд и пользователь после нажатия на кнопку "Отправить форму" видит секунд 5-8 прелоадер и лишь за тем всплывайку. Я постарался переработать логику php примерно так:

1. Проверят валидность пришедших данных
2. Занести данные в базу
3. Возвращает JSON данные для всплывающего окна, мол "Ваша заявка успешно принята".
4. Рассылает 5-ть писем (администраторы, менеджеры) с тем, что мол пришла новая заявка
5. На amoCRM тоже что-то отсылает

Сделал это с помощью решения, которе нашел здесь:
stackoverflow.com/questions/138374/close-a-connect...
На Apace работает отлично, на nginx не работает

Мой новый PHP код:

private function send_response($array = ['response' => 'response', 'success' => true])
    {
        ob_end_clean();
        header("Connection: close");
        ignore_user_abort(true);
        ob_start();
        echo json_encode($array);
        $size = ob_get_length();
        header("Content-Length: $size");
        ob_end_flush();
        flush();
    }

public function buyAction()
    {
       // Save callback
       // это были быстрые действия, дальше отправка ответа
      
        $this->send_response([
            'response' => $popup->popup_text,
            'type' => 3,
            'title' => $popup->popup_title,
            'code' => $this->code,
            'success' => true
        ]);
	
        // Send E-Mail и другие длинные действия
        die;
    }


У меня на локальном OpenServer где используется Apache все работает. Я посылаю заголовки "Connection: close" и "Content-Length: $size" мой браузер это видит, понимает, что новых данных больше не будет, закрывает соединение и начинает обработку полученных данных.

Заголовки ответа Apache выглядят так:

HTTP/1.1 200 OK
Date: Tue, 25 Apr 2017 08:24:47 GMT
<b>Server: Apache</b>
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
<b>Connection: close</b>
<b>Content-Length: 942</b>
Content-Type: text/html; charset=UTF-8


Заголовки ответа nginx выглядят так:

HTTP/1.1 200 OK
<b>Server: nginx</b>
Date: Tue, 25 Apr 2017 07:39:27 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
<b>Connection: keep-alive</b>
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip


Вопрос. Как заставить nginx не игнорировать заголовки? В идеале, чтобы нужно keep-alive оставить для других соединений (все-таки читал, что это круто и быстро), но вот если я вручную, т.е. жестко передаю "Connection: close" и "Content-Length: $size" то нужно их передать, не нужно из обрезать.

P.S. извините, если я где-то некомпетентен и некорректно описал задачу, я верстальщик, но оочень хочу решить эту проблему.
  • Вопрос задан
  • 2362 просмотра
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 1
BuriK666
@BuriK666 Куратор тега Nginx
Компьютерный псих
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы