5 ответов:
чтобы получить доступ к телу сущности запроса POST или PUT (или любого другого метода HTTP):
$entityBody = file_get_contents('php://input');и
STDINконстанта-это уже открытый поток вphp://input, так что вы можете сделать:$entityBody = stream_get_contents(STDIN);С PHP ручной ввод в потоках ввода/вывода docs:
php: / / input это поток только для чтения, который позволяет читать необработанные данные из тела запроса. В случае POST-запросов, желательно использовать php: / / input вместо
$HTTP_RAW_POST_DATAкак это не зависит от специального php.ini-директивы. Кроме того, для тех случаев, когда$HTTP_RAW_POST_DATAне заполняется по умолчанию, это потенциально менее интенсивная альтернатива активации памяти always_populate_raw_post_data. php: / / input не доступно с enctype= "multipart / form-data".в частности, вы хотите отметить, что
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: / / input недоступен для запросов, указывающих a (
enctype="multipart/form-data"в HTML-формах). Это приводит к тому, что PHP уже проанализировал данные формы в$_POSTсуперглобальная.
Если вы установили расширение HTTP PECL, вы можете использовать
http_get_request_body()функция для получения данных тела в виде строки.
Регистрация
$HTTP_RAW_POST_DATAпеременная
Если у вас pecl / http расширение установлено, вы также можете использовать это:
$request = new http\Env\Request(); $request->getBody();
Comments