Я видел следующую проблему на Apache 2.2 / PHP 5.3 и на Apache 2.4 / PHP 5.4
Я столкнулся с редкой проблемой, когда запросы POST (небольшие, менее 1 КБ) к веб-серверу, кажется, обрезаются до того, как они достигнут службы PHP, которая будет действовать с данными. Мне не удалось воспроизвести проблему, поэтому я работаю только с доказательствами, собранными из журналов. В каждом случае я получаю запрос с допустимым ненулевым заголовком Content-length, но без тела.
Я сбросил различную информацию о вызывающем агенте и не вижу никакой закономерности. Неисправные запросы поступают из различных браузеров и исходных IP-адресов, и для любого заданного IP-адреса я вижу множество действительных запросов вокруг случайных неработающих запросов.
Я пробовал использовать getRequestBody () pecl_http и file_get_contents ("php: // input"), и ни один из них не возвращает никаких данных в этом случае.
Я также временно включил mod_dumpio, и в случае ошибочной транзакции я вижу запись, в которой он пытается буферизовать тело запроса:
mod_dumpio: dumpio_in [readbytes-blocking] 288 readbytes
за которым обычно следует фактическая буферизация данных, например:
mod_dumpio: dumpio_in (data-HEAP): 288 bytes
mod_dumpio: dumpio_in (data-HEAP): (the post data)
Но в случае, когда я сталкиваюсь с проблемой, я не вижу этих записей, есть заметная задержка в НЕСКОЛЬКО СЕКУНД в этом процессе apache, а затем вместо этого я вижу еще несколько экземпляров:
mod_dumpio: dumpio_in [readbytes-blocking] 288 readbytes
mod_dumpio: dumpio_in - 70014
И в сочетании с этими повторяющимися попытками чтения я вижу свидетельства того, что поток PHP выполняет неправильный запрос и выдает ответ.
Кажется из Протокол HTTP 4.4 что тело запроса ДОЛЖНО соответствовать длине содержимого, чтобы запрос был действительным, поэтому я изо всех сил пытаюсь понять, как рассматриваемые запросы передаются в PHP.
Я также должен упомянуть, что тип содержимого в этом случае предоставляется как application / x-www-form-urlencoded, хотя отправленные данные являются необработанными json. Поскольку я читаю данные непосредственно из потока, я не думаю, что это связано с моей проблемой, но об этом стоит упомянуть.
Я не хочу слепо сравнивать длину содержимого с strlen ($ content) в PHP, но у меня заканчиваются возможности для дальнейшей диагностики проблемы. Мы будем очень благодарны за любую помощь в том, как исправить эту ситуацию ИЛИ собрать дополнительную ценную отладочную информацию.