Код
У меня есть следующий очень простой код в index.php
:
<?php
if (!function_exists('getallheaders')) {
// Outputs all HTTP headers
function getallheaders()
{
$headers = [];
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') {
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
}
return $headers;
}
}
echo "Content:\n" . @file_get_contents("php://input") . "\n" .
"Post:\n" . print_r($_POST, true) . "\n" .
"Headers:\n" . print_r(getallheaders(), true) . "\n";
die();
Контрольный тест
Я локально запустил сервер следующим образом:
$ php -S localhost:8080
Затем я выполнил следующую команду:
$ curl -H "Transfer-Encoding: chunked" -d "payload to send" http://localhost:8080
И он вернулся, как и ожидалось:
Content:
payload to send
Post:
Array
(
[payload_to_send] =>
)
Headers:
Array
(
[Host] => localhost:8080
[User-Agent] => curl/7.55.1
[Accept] => */*
[Transfer-Encoding] => chunked
[Content-Type] => application/x-www-form-urlencoded
)
Все хорошо здесь!
Я также проверил это на Ubuntu 16.04 на PHP 7.0, и все это прекрасно работает!
Проблема
Всякий раз, когда я запускаютот же код на сервере под управлением PHP 7.1, 7.2 или 7.3 или выше в сочетании с Apache 2, я получаю следующий вывод:
Content:
Post:
Array
(
)
Headers:
Array
(
[Transfer-Encoding] => chunked
[Accept] => */*
[User-Agent] => curl/7.55.1
[Host] => thedealerapp.test
)
Обратите внимание, что если я удалю заголовок кодировки передачи, он не будет разбит на частивсе работает нормально.Ясно, что существует проблема с PHP и / или apache, которая не допускает чанкированные запросы.
Подобная проблема описана здесь: POST-запрос к PHP7 с чанкованным кодированием не возвращает должным образом результат
Но он помечен как решенный, и я использую более новые версии PHP 7.1, PHP7.2 и PHP 7.3.
Почему это происходит и как я могу это исправить?Большое спасибо!
Обновление
Я выяснил, что эта проблема возникает только с FPM-версиями PHP.Нормальные версии PHP, кажется, работают нормально.
Обновление 2
Благодаря @IVO GELOV мне теперь удалось заставить его работать на nginx.Похоже, что это проблема комбинации php-fpm и Apache.