libcurl для обменна данных
libcurl это библиотека функций, которая позволяет взаимодействовать (обмениваться информацией) с различными серверами по различным протоколам. В настоящее время libcurl поддерживает протоколы http, https, ftp, gopher, telnet, dict, file, и ldap. libcurl также умеет работать с сертификатами HTTPS, посылать запросы к HTTP серверам методами POST и PUT, закачивать файлы по протоколам HTTP и FTP (последнее можно сделать также используя модуль FTP), использовать прокси-серверы, cookies и аутентификацию пользователей.
Нас поймут только по протоколу
Любые сервера, в том числе и web, умеют реагировать на присланные им данные т, но только в том случае, если они понимают, что им прислали. Для этого, данные посылаемые им оформляются согласно определенным правилам. Такой набор правил и называется протоколом. Данные по протоколу оформит libcurl сама, мы же лишь рассмотрим далее как их ей передать.
Раз, два, начали.
Функций в библиотеке совсем не много, но одну из них, приводящую шестеренки в действие, вы встретите в любом скрипте с curl. curl_init — Инициализирует сеанс CURL
Другими словами - эта функция запускает механизм curl и возвращает указатель, дескриптор на созданный механизм.
Напомню что такое ресурс (указатель), тем кто забыл.
Дескриптор ( Resource )
Дескриптор представляет из себя указатель, ссылку, на внешний ресурс.
Представим автосервис с большим количеством машин, которым заливают несколько по литров масла в двигатель. Со свистом тормозов из подворотни вылетает феррари и паркуется на очередной сервисной парковке. Хозяин сервиса уже кричит рабочему, залить 5 литров масла и тычет большим пальцем в красную феррари.
Наш рабочий получает в данном случае два типа данных - число (литров масла) и указатель на машину, то-есть определение - какому именно объекту из всех вокруг нужно подлить чего-нибудь.
Подмечу, что рабочий получает от босса вовсе не саму машину, а лишь дескриптор (указатель) машины с которой предстоит работать. В php этим дескриптором является тип данных resource.
Функция curl_init также может сразу принимать url, адрес того сервера с которым будем общаться. Можно его и не указывать, а указать попозже. Инициализировав механизм, можно сразу отправить запрос, ну и наконец освободить память от этого механизма.
Вот что в итоге получится:
результатом этого кода будет прямой вывод содержимого главной страницы php.su. Не всегда нужно вывести результат запроса прямо в браузер и для этого достаточно просто покрутить пару настроек. Сейчас выясним как это сделать.
1. valenok - 25 Мая, 2009 - 00:37:54 - перейти к сообщению
Конфигурируем общение
curl_setopt — Устанавливает параметр для сеанса CURL
параметры бывают разные, и их много, очень. Какой за что отвечает можно посмотреть, само собой, в справочнике функции curl_setopt. Мы же сейчас рассмотрим парочку основных и выясним как ими манипулировать.
Но прежде я хочу вернуться на момент к обсуждению протокола http. Из чего же состоит набор правил этого протокола. Давай посмотрим как браузер общается с нашим сервером, что он ему посылает, и что тот от него получает. Я для этого использую расширение браузера livehttpheaders. И вот, что происходит при общении браузера с сервером:
Общение браузера с сервером получилось не слишком замысловатое. Смотрим:
GET /index.php HTTP/1.1 Дай страницу index.php. данные пришли правильно оформленные
Host: php.su с сайта php.su
User-Agent: Mozilla/5.0 А вот такой вот!
Accept: text/html И понимаю я только текст и html.
Accept-Language: ru,en-us; И говори по русски или я твоя не понимать
Accept-Charset: windows-1251,utf-8; Со специями пожалуйста.
Connection: keep-alive Жду от тебя ответа
Keep-Alive: 300 но терпения у меня мало.
Cookie: lastvisit=1243232518; А еще я заходил вчера и заказывал столик. Помнишь меня ? Нет? ну не важно, ты просил напомнить что я заходил во столько то. Теперь вспомнил? Отлично. Где мой столик ?
HTTP/1.1 200 OK Данные принял, состояние 200.
Date: Mon, 25 May 2009 06:33:05 GMT
Server: Apache Вас обслуживает ООО "Сервер Apache"
X-Powered-By: PHP/5.2.6 Старший шеф повар, php 5.2.6
Transfer-Encoding: chunked Это порция первая, вторая ща будет
Connection: close А теперь получил?, распишись, больше не жди
Content-Type: text/html; charset=cp1251 Ваша пицаа по русски, с грибами
Сразу после заголовков ответа идёт сам ответ, тоесть html страницы. А мы, тем временем, что стали свидетелями общения моего браузера с сервером php.su. А раз браузер может, то и мы с нашей программой можем.
Заказываем данные с нужными опциями
После того, как мы запустили наш код простой код
Для этого установим опцию "показывать заголовки"
CURLOPT_HEADER : При установке этого параметра в ненулевое значение результат будет включать полученные заголовки.
Разумеется параметры устанавливать нужно до того, как отправим сам запрос серверу. И так, получилось вот такое: