20

Привет встретил код

$body = file_get_contents('php://input');

Этот метод нужен чтобы получить содержимое POST и GET запросов?Чем уже $_POST и $_GEt не устроил? Зачем вообще нужен этот ужас?

Читая статью трудно въехать для чего нужны эти самые потоки...Ни примеров ни толквого изложения.... http://www.php.net/manual/ru/wrappers.php.php

zloctb
  • 2,480
  • file_get_contents читает содержимое файла, вроде как. При чем тут запросы? – andreyqin Oct 16 '13 at 05:23
  • читает еще модержимое потоков...А что это за потоки,реки...мне не понятно.Дебилный раздел PHP – zloctb Oct 16 '13 at 05:28

3 Answers3

36

К примеру вам нужно отправить json сериализованную строку. Передавать это нужно через POST, потому что в GET длина этой самой строки ограничена, кажется, 4мя килобайтами.

Что же именно передается POST методом ?

А передается вот что:

POST /test/script.php HTTP/1.1
Host: site.com
Content-Length: xxxx
... и другие заголовки..

paramName1=paramValue1&paramName2=paramValue2...

Передавать что-то типа: abc=<json_string> не хочется, потому что нужно экранировать еще эту строку.

Поэтому мы просто скармливаем строку скрипту. На сервер прийдет что-то типа такого:

POST /test/script.php HTTP/1.1
Host: site.com
Content-Length: xxxx
... и другие заголовки..

{"paramName1": "paramValue2","paramName2": "paramValue2",...}

Естественно, сервер не умеет парсить такие запросы, поэтому нам на помощь приходит file_get_contents('php://input');

Мы можем получить то, что нам прислали, без изменений, самим распарсить это и быть счастливым :)

αλεχολυτ
  • 28,987
  • 13
  • 60
  • 119
Alex Kapustin
  • 11,694
  • 1
  • 20
  • 22
11

чем вас мануал не устраивает?

оригинал:

php://input is a read-only stream

перевод:

php://input является потоком только для чтения

оригинал:

php://input instead of $HTTP_RAW_POST_DATA as it does not depend on special php.ini directives. Moreover, for those cases where $HTTP_RAW_POST_DATA is not populated by default, it is a potentially less memory intensive alternative to activating always_populate_raw_post_data.

перевод:

В случае POST-запросов предпочтительней использовать php://input вместо $HTTP_RAW_POST_DATA, так как этот метод не зависит от специальных php.ini директив. Кроме того, в тех случаях, где $HTTP_RAW_POST_DATA не заполняется по умолчанию, это потенциально менее затратно для памяти, чем активация директивы always_populate_raw_post_data.

оригинал:

php://input is not available with enctype="multipart/form-data"

перевод:

php://input не доступен с типом содержимого enctype="multipart/form-data"

читать надо внимательней

qpaycm
  • 1,210
  • 7
  • 12
  • 2
    Ухты я поставил в php.ini post_max_size=1KB и действительно $_POST пустой а file_get_contents('php://input') содержит все данные которые передавали.... – zloctb Oct 16 '13 at 09:17
  • удивительное рядом :-D – qpaycm Oct 16 '13 at 09:41
2

Список методов не ограничивается GET и POST. Например в REST спецификации используются еще PUT, DELETE и еще какие-то. Обрабатываются они соответственно через php://input.

А смысл то простой, мы получаем таким образом сырой запрос, очень полезная штука.