Отправка POST запросов с помощью php. Часть 3

streamВ предыдущей статье по отправке запросов методом POST мы разбирались с библиотекой curl. Сегодня, возьмем на вооружение группу php-функций, которая называется Stream Functions.
Что это за группа такая? Никто нигде об этой группе функций не пишет и гугл молчаливо ссылается на справочник по php. Поэтому будем разбираться с англоязычным мануалом. Из названия можно понять, что эти функции предназначены для работы с потоком. Снова не понятно, что это за поток такой? Но если разобраться по подробнее, то выходит так.

Небольшое теоретическое вступление
Потоки были введены в php в версии 4.3.0. Был разработан специальный единый API для работы с потоками. Суть этой разработки состояла в том, чтобы ядру Zend Engine и всем другим внутренним функциям было удобнее работать с файлами и сокетами. Также был создан интерфейс и для php.
Механизм работы приблизительно таков: функции для чтения файлов, кроме стандартных параметров могут принимать еще один параметр. Условно, его можно назвать контекстом. В зависимости от контекста, выбирается враппер для обработки файлов или сокетов. Если инициализирован контекст для работы с ftp, то выбирается враппер ftp. Если инициализирован контекст для работы с http, то соответственно, выбирается враппер http.

Функции
Для отправки post-запроса на сервер, нам понадобится всего одна функция из этого раздела. Функция имеет название stream_context_create().

resource stream_context_create ( [array $options] )

Параметры:

  • $options – массив с опциями, для создания конкретного контекста. Опции бывают разные, для разных врапперов. Для http-враппера, опции можно посмотреть здесь

Функция создает и инициализирует контекст для последующего использования в функциях чтения файлов. Функция возвращает ресурс, созданного контекста.
Массив опций, которые передаются в функцию stream_context_create имеет такой вид:
‘wrapper_name’=>array(
‘option1’=>’value1’,
‘option2’=>’value2’
)
где wrapper_name – имя создаваемого враппера. В нашем случае это будет http. Из всех опций враппера, нам понадобятся опции

  • method – для указания метода, отправляемого запроса;
  • header – для указания заголовков, про которые можно почитать в первой статье
  • content – это собственно данные для post-запроса.

Теперь собственно код.
Для тестирования возьмем все тот-же тестовый файл test.php, который использовали в прошлый раз.

test.php

 
echo 'Name:'.$_POST['name'],"<br>",
'Surname:'.$_POST['surname'];
 
?>

Сложного ничего нет: выводим post-переменные name и surname, а между ними <br>.

context.php

 
//создаем строку запроса из данных в массиве
$post = http_build_query(
array(
'name'=>'John',
'surname'=>'Smith'
)
);
//опции для создания контекста
$c_options = array(
//имя враппера - http
'http'=>array(
//метод - POST
'method'=>'POST',
//заголовки
'header'=>"Content-type: application/x-www-form-urlencoded\r\n".
"User-agent:Opera 10.00\r\nContent-length:".strlen($post)."\r\nConnection:close",
//данные
'content'=>$post
)
);
//создаем контекст
$context = stream_context_create($c_options);
//читаем файл с контекстом
$res = file_get_contents('http://www.example.loc/post/test.php',
false,$context);
//выводим результат
echo $res;
?>

Я думаю, тут все ясно из комментариев. Если кому-то что-то будет не ясно, то можете задавать вопросы в комментариях.
При обращении к файлу context.php должен отобразиться текст

Name:John<br>Surname:Smith

Именно этот текст и должен был отобразиться.
Стоит также сказать, что кроме функции file_get_contents() можно использовать функцию readfile() для чтения потока. Разница только в том, что readfile() выведет результат на экран. Кроме этих двух функций можно использовать практически все функции для чтения файлов. Т.е. это будет работать с fopen(), file() и др.
На этом я заканчиваю свою серию из трех статей о post запросах в php. Если у меня будут еще данные по этой теме, то я обязательно продолжу писать, а на данный момент у меня все.
Читайте все статьи цикла.
В первой части рассматривается работа с сокетами.
Во второй части описывается библиотека cURL.
В третьей части можно почитать о работе с Stream Function.
В четвертой части описывается отправка файла через POST.
В пятой части описывается отправка POST-запросов в Zend Framework.

Популярность: 13%


Интересное из других блогов:

2leep.com

И не забывайте комментировать статью.

Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта

Отзывов: 7 на «Отправка POST запросов с помощью php. Часть 3»

  1. Автор: gosha, 23 марта 2010 в 01:21

    использует Firefox 3.5.8 Firefox 3.5.8 на Windows XP Windows XP

    Как в этом примере (stream_context_create) указать порт, на который надо послать post-запрос?

    • Автор: web-junior, 23 марта 2010 в 11:27

      использует Firefox 3.5.8 Firefox 3.5.8 на Windows XP Windows XP

      судя по всему порт указать невозможно (http://www.php.net/manual/en/context.http.php). Если вам нужно послать запрос по другому протоколу, то используйте другой враппер.

    • Автор: MuFF, 12 октября 2011 в 10:10

      использует Chromium 14.0.801.0 Chromium 14.0.801.0 на Ubuntu 11.04 Ubuntu 11.04

      указывается в строке урла: file_get_contents(‘http://host:4444/index.php', false, context);

  2. Автор: Андрей, 19 апреля 2010 в 11:33

    использует Firefox 3.6.3 Firefox 3.6.3 на Windows 7 Windows 7

    А можно побольше про Stream Functions написать. Я вот читал, что они позволяют обрабатывать сразу несколько потоков. Т.е. скажем сразу несколько RSS за счет этого сокращается время выполнения скрипта и нагрузка.

    • Автор: web-junior, 19 апреля 2010 в 16:14

      использует Firefox 3.5.8 Firefox 3.5.8 на Windows XP Windows XP

      Об этом как нибудь в другой раз напишу. Сейчас занят написанием другого материала.

  3. Автор: Smirna, 23 июня 2010 в 10:31

    использует Internet Explorer 7.0 Internet Explorer 7.0 на Windows Vista Windows Vista

    Если я не ошибаюсь, то не сработал метод подсветки кода РНР…
    исправьте, что бы было наглядней :)

    • Автор: web-junior, 23 июня 2010 в 11:08

      использует Firefox 3.5.9 Firefox 3.5.9 на Windows XP Windows XP

      Да, действительно возникли некоторые проблемы с плагином подсветки кода.
      Спасибо вам, что заметили и сообщили об этой проблеме!

RSS-лента комментариев.

Ваш отзыв

Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">

Нажимая на кнопку "Добавить" вы принимаете правила комментирования