Добрый день, у меня есть 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. извините, если я где-то некомпетентен и некорректно описал задачу, я верстальщик, но оочень хочу решить эту проблему.