Отправка POST запросов с помощью php. Часть 3
В предыдущей статье по отправке запросов методом 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И не забывайте комментировать статью.
Добавляйся в группу во вконтакте, чтобы самым первым узнавать все новости сайта
Автор: gosha, 23 марта 2010 в 01:21
используетКак в этом примере (stream_context_create) указать порт, на который надо послать post-запрос?
Автор: web-junior, 23 марта 2010 в 11:27
используетсудя по всему порт указать невозможно (http://www.php.net/manual/en/context.http.php). Если вам нужно послать запрос по другому протоколу, то используйте другой враппер.
Автор: MuFF, 12 октября 2011 в 10:10
используетуказывается в строке урла: file_get_contents(‘http://host:4444/index.php', false, context);
Автор: Андрей, 19 апреля 2010 в 11:33
используетА можно побольше про Stream Functions написать. Я вот читал, что они позволяют обрабатывать сразу несколько потоков. Т.е. скажем сразу несколько RSS за счет этого сокращается время выполнения скрипта и нагрузка.
Автор: web-junior, 19 апреля 2010 в 16:14
используетОб этом как нибудь в другой раз напишу. Сейчас занят написанием другого материала.
Автор: Smirna, 23 июня 2010 в 10:31
используетЕсли я не ошибаюсь, то не сработал метод подсветки кода РНР…
исправьте, что бы было наглядней
Автор: web-junior, 23 июня 2010 в 11:08
используетДа, действительно возникли некоторые проблемы с плагином подсветки кода.
Спасибо вам, что заметили и сообщили об этой проблеме!