php отдает http 200, но приходит 500
Столкнулся с тем, что при отправки формы в ответ приходит валидный json, но http status — 500.
Причем происходит только с большими картинками.
К форме можно приложить макс 5 картинок по 10 мб макс.
Проверил — пхп 100% отдает 200.
С помощью функции http_response_code можно узнать последний код ответа — сделал логирование в конце index.php — выводил 200.
Но в логах nginx смотришь — 500.
Между пхп и nginx что-то происходит.
Сервис на Yii2.
Оказалось, что yii2-debug, после отдачи ответа и всех заголовков, пытается сериализовать запроса для лога. А загрузку картинки сделали не в виде файла, а в виде base64. 5 картинок по 10мб в base64. И все это пытается сериализоваться. И падает по лимиту памяти. Поэтому ответ догоняется статусом 500.
Все это перемешивается — статус и корректное тело ответа — и отдается клиенту.
Раньше ошибочно думал, что после отправки заголовков и echo — все уходит клиенту и можно заниматься своими делаем.
Но чтобы отправить все клиенту, нужно выполнить fastcgi_finish_request, которая как раз отправляет все клиенту и завершает соединение, но продолжает выполнение скрипта.
Либо, с помощью буферизации отдать контент и отправить заголовок об окончании соединения
header('Connection: close');Пример закрытия соединения взят с этого поста.