воскресенье, 6 марта 2011 г.

CURL или учимся работать с удаленными хостами

Появилась у меня недавно задача: получить данные с внешнего сайта. Всю жизнь я обычно работал с сокетами, напрямую отсылал заголовки, получал ответы. Вроде бы было все понятно и просто (хотя честно признаюсь, давно, когда только начинал, сырые заголовки web мне казались страшнее ядерной зимы). Но скучно. Главный враг и одновременно друг программиста именно скука…ну и еще лень. Скука ведет к тому, что ты начинаешь создавать что-то новое, придумываешь новые концепции…иногда конечно изобретаешь велосипед (ну куда ж без этого), но чаще пишешь стройную и логичную систему, поэтому я говорю что скука это лучший союзник, но это и враг ибо на изучение, продумывание, написание чего-то нового уходит гораздо больше времени, чем на реализацию более кривых, но рабочих решений.

Но я отвлекся..так вот решил я почитать доки по curl (на сервере часто юзал эту либу, а вот в php не приходилось), дабы реализовать работу со страничкой чужого сайта на основе этой замечательной библиотеки.

Итак, для начала нам нужно продумать алгоритм действий. Он достаточно просто.
Инициируем соединение, после чего посылаем все требуемые параметры (например параметры POST, информацию о себе, браузер и т.д) на удаленный хост, получаем ответ и делаем с ним то что нам требуется. На первый взгляд просто не так ли?
Но, как говорится, вся соль в деталях. Приведу пример.


<?php

//Инициируем соединение с сайтом www.example.com

$c  curl_init('www.example.com');

//Если есть переадресации автоматически нас автоматически перенесет

curl_setopt($c,CURLOPT_FOLLOWLOCATION,true);

/*Полученные данные будут возвращены не напрямую в браузер

как было бы без этого параметра, а в переменную */

curl_setopt($c,CURLOPT_RETURNTRANSFER,true);

//Юзер-агент

curl_setopt($c,CURLOPT_USERAGENT,'Паучок');

//Максимальное время попытки соединения с удаленным хостом

curl_setopt($c,CURLOPT_TIMEOUT,30);

//Собственно выполняем соединение

$data=curl_exec($c);

//Закрываем соединение.

curl_close($c);

?>

Я наделюсь что в этом отрывке кода с комментариями вам все понятно. Это самый простейший вариант.

Может случиться так что Вам потребуется осуществлять забор данных с сайта, защищенного http авторизацией. В этом случае до curl_exec вам следует установить еще два параметра:


<?php

//Тип авторизации basic

curl_setopt($curlCURLOPT_HTTPAUTHCURLAUTH_BASIC ) ;

//Имя пользователя и пароль

curl_setopt($curlCURLOPT_USERPWD"username:password"); 

?>

Так же часто требуется не просто слать пустой запрос, но и посылать post или get параметры. Для этого, надо указать так же дополнительные опции:


<?php

//Указываем что запрос идет через метод пост

curl_setopt($curlCURLOPT_POSTtrue);

//Отправляем параметры пост

curl_setopt($curlCURLOPT_POSTFIELDS'param1=value1&param2=value2&param3=value3'); 

?>

Теперь, я думаю, вы ощущаете насколько удобна данная библиотека. И это при том? что я описал лишь малую толику возможных параметров, на самом же деле их гораздо больше. Например, можно использовать proxy или работать с фтп Более подробно вы можете прочесть в мануале по функции curl_setopt или в документации на офф сайте php.

Зачастую список параметров гораздо удобнее передавать массивом, для этого сушествует curl_setopt_array Ключами в данном случае должны быть имена параметров, а значения-те значения, которые вы считаете нужным присвоить данным параметрам.

Если соединение не проходит обычно требуется разобраться в чем дело. Поэтому после отправки запроса стоит использовать функции curl_error и curl_errno


<?php

// инициализация сеанса

$ch curl_init();

curl_setopt($chCURLOPT_URL"http://www.example.com/");

curl_setopt($chCURLOPT_HEADER0);

curl_exec($ch);

$error curl_error($ch);

$errno curl_errno($ch);

curl_close($ch);

?>

Теперь если возникнет ошибка вы сразу сможете просмотреть ее код и текст.

Пожалуй все на сегодня. Надеюсь что Вам стали понятны основы работы с curl… а дальше, все в ваших руках. Удачи в изучении PHP:)

1 комментарий: