Чтобы получить доступ к телу объекта запроса POST или PUT (или любого другого метода HTTP):
$entityBody = file_get_contents('php://input');
Кроме того, константа STDIN
- это уже открытый поток для php://input
, так что вы можете сделать следующее:
$entityBody = stream_get_contents(STDIN);
Из ручной записи PHP для потоков ввода-вывода документы :
php: // input - это поток только для чтения, который позволяет читать необработанные данные
из тела запроса. В случае запросов POST это предпочтительно
использовать php: // input вместо $HTTP_RAW_POST_DATA
, поскольку это не так
зависит от специальных директив php.ini. Более того, для тех случаев, когда
$HTTP_RAW_POST_DATA
не заполняется по умолчанию, это потенциально
менее интенсивная память альтернатива активации
always_populate_raw_post_data. php: // input недоступно для
ENCTYPE = "многочастному / форм-данных".
В частности, вы должны заметить, что поток php://input
, независимо от того, как вы обращаетесь к нему в веб-SAPI, не доступен для поиска . Это означает, что его можно прочитать только один раз. Если вы работаете в среде, в которой регулярно загружаются большие объекты сущностей HTTP, вы можете сохранить входные данные в виде потока (вместо того, чтобы буферизовать их, как в первом примере выше).
Для поддержки потокового ресурса может быть полезно что-то вроде этого:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
позволяет управлять потреблением памяти, поскольку оно прозрачно переключится на хранилище файловой системы после сохранения определенного объема данных (по умолчанию 2M). Этим размером можно манипулировать в файле php.ini или добавив /maxmemory:NN
, где NN
- максимальный объем данных, сохраняемых в памяти перед использованием временного файла, в байтах.
Конечно, если у вас нет действительно веской причины для поиска во входном потоке, вам не понадобятся эти функции в веб-приложении. Обычно достаточно прочитать тело сущности HTTP-запроса один раз - не заставляйте клиентов ждать весь день, пока ваше приложение выяснит, что делать.
Обратите внимание, что ввод php: // недоступен для запросов, указывающих заголовок Content-Type: multipart/form-data
(enctype="multipart/form-data"
в формах HTML). Это результат того, что PHP уже проанализировал данные формы в $_POST
суперглобальном.