Скачать справочник по MySQL

Применение cURL и libcurl в php

   В наше бурное время присутствует большое количество технологий, которые имеют прямую связь с глобальной сетью Интернет. Сегодня мы поговорим о сетевых библиотеках php - cURL и libcurl.

При работе в сети Интернет, вы непосредственно сталкиваетесь с работой по HTTP. Хотя php довольно хорошо ориентирован с работой по данному протоколу, но все же присутствуют моменты, в которых он не раскрывает весь свой потенциал в полной мере. В частности, хотя средство потоков РНР Streams позволяет довольно просто получать доступ к ресурсам HTTP, как если бы они были файлами, оно нет возможности получить доступ к метаинформации, такой как коды ответа транзакций HTTP. Точно так же и встроенные команды РНР не позволяют устанавливать требуемые свойства транзакций HTTP наподобие пользовательского агента.

Вкратце рассмотрим что такое HTTP транзакция. Рядовой пользователь открывает браузер, вводить в строку запроса какой-либо URL и ждет когда в окне его браузера отобразиться содержимое запрошенной страницы, причем ему абсолютно неизвестно каким образом она «доставляется» на компьютер клиента. К примеру пользователь ввел URL вида:
http://www.example.com/index.php
После ввода браузер клиента начинает «разбирать» данную строку запроса, а делает он это следующим образом:
1. Для передачи использовать протокол HTTP
2. Извлечь запрошенный URL-адрес с компьютера, находящегося на example.com
3. Получить информационный ресурс, известный, как /index.php
Далее такая порция информации преобразовывается в так называемую HTTP транзакцию, которая выглядит следующим образом:

GET /index.php HTTP/1.1
Accept: image/gif, image/png, image/jpeg, */*
Accept-Language: en-us
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0;
Windows 98; .NET CLR 1.1.4322)
Host: example.com
Connection: Keep-Alive

В данной статье мы не будем разбирать конкретно что такое транзакция, здесь я привел лишь краткий пример для того чтобы читателю стало понятно о чем пойдет речь далее.

 cURL является сокращением от “Client URLs”. Главным разработчиком является Daniel Stenberg. В 1998 году cURL был разработан как утилита, работающая из командной строки. Libcurl – является переносимой библиотекой, которая предоставляет травиальный API-интерфейс к функциональности cURL. Безопасность библиотеки обеспечивается исключительно в мультипоточной среде, которая непосредственно совместима с IPv6 а также имеет возможность поддерживать непрерывный сокет. Интерфейс взаимодействия с php был разработан и внедрен Sterling Hughes.

Прежде всего следует рассмотреть основное назначение данных библиотек. cURL и libcurl - библиотеки, позволяющие серверу передавать файлы на удаленный компьютер, используя множество Интернет протоколов. В пример можно привести наиболее известные протоколы: HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET и FILE. Вообще, если касаться более сложных аспектов программирования на php то так же стоит отметить еще две полезные вещи - Snoopy и HttpClient.

Ниже стоит рассмотреть наглядный пример использования cURL в php.

Сорц Файл (работа по http):

<?
/* строка запроса */
$url = “http://www.google.ru/search?hl=ru&q=curl+in+php&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA+%D0%B2+Google&lr=”;
$ch = curl_init(); //инициализируем curl сессию
/* далее устанавливаем опции для CURL-трансфера. */
curl_setopt($ch, CURLOPT_URL, $url); // URL который должен быть получен
curl_setopt($ch, CURLOPT_HEADER, 0); // Передаёт массив полей HTTP-header’а для установки
curl_setopt($ch, CURLOPT_POST, 0); // Выполняем регулярный HTTP POST
curl_setopt($ch, CURLOPT_COOKIE, 0); // Передаём строку с содержимым cookie, установленным в HTTP хидере
curl_setopt($ch, CURLOPT_TIMEOUT, 15); // Максимальное время работы curl функции
curl_setopt($ch, CURLOPT_REFERER, $url); // Передаем строку содержащую реф, исходя из переданных хидеров
curl_setopt($ch, CURLOPT_USERAGENT, “Mozilla/4.0.”
.”(compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322)”); // Бразуер клиента
$content = curl_exec($ch); // Выполняем curl сессию
curl_close($ch); // Завершаем curl сессию
echo $content.”\n”; // Выводим на экран выполненый запрос
?>

Сорц Файл (работа по ftp):
<?
$fp = fopen(__FILE__, “r”); //открываем файл
/* искомый URL(ftp) */
$url = “ftp://username:password@mydomain.com:21/path/to/newfile.php”;
$ch = curl_init(); //инициализируем curl сессию
curl_setopt($ch, CURLOPT_URL, $url); // URL который должен быть получен
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //непосредственно возвращаем трансфер
curl_setopt($ch, CURLOPT_UPLOAD, 1); // подготавливаем файл к «выгрузке»
curl_setopt($ch, CURLOPT_INFILE, $fp); // Файл, из которого приходит ввод вашего трансфера
curl_setopt($ch, CURLOPT_FTPASCII, 1); // режим ASCII для FTP
curl_setopt($ch, CURLOPT_INFILESIZE, filesize(__FILE__)); //возвращаем трансфе вместо печати напрямую
$result = curl_exec($ch); // Выполняем curl сессию
curl_close($ch); // // Завершаем curl сессию
?>

Сорц Файл (работа с Куками)

Index.php

<?
$root_directory = dirname(__FILE__); ..имя директории
$cookie_file = $root_directory.”/curl.cookie”; //объединяем => путь
$curl_channel = curl_init(”http://moon/curl_test/set_cookie.php”); //инииализируем сессию
curl_setopt($curl_channel, CURLOPT_RETURNTRANSFER, true); //возвращяем трансфер без печати
curl_setopt($curl_channel, CURLOPT_COOKIEFILE, $cookie_file); //передаем строку содержащую имя файла с данными куки
curl_setopt($curl_channel, CURLOPT_COOKIEJAR, $cookie_file);
$result = curl_exec($curl_channel); //выполняем curl сессию
curl_close($curl_channel); // завершаем работу curl
echo $result; // выводим полученный результат
?>

set_cookie.php

<?
setcookie(”kyborg”, “tortoise cvs”); //отправляем кукисы
echo “<pre>”; //форматируем вывод
var_dump($_COOKIE); //дамп информации о переменной
echo “</pre>”; //завершаем форматирование
?>

В данных примерах наглядно продемонстрирована работа библиотеки curl. Перед программистами очень часто стоит выбор, что лучше использовать: cURL или же libcurl. Если вы хотите написать выполняемый из командной строки скрипт, или же ваш провайдер не поддерживает libcurl, имеет смысл использовать cURL. В остальных случаях использование libcurl оказывается более удобным.

В заключении стоит также привести наиболее употребимые опции curl трансфера:

CURLOPT_VERBOSE - Установите эту опцию в ненулевое значение, если вы хотите, чтобы cURL сообщала обо всех действиях.

CURLOPT_UPLOAD - Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP подготавливал файл к выгрузке.

CURLOPT_FOLLOWLOCATION - Установите эту опцию в ненулевое значение, чтобы следовать любому “Location: ” header, который сервер высылает как часть HTTP header’а (заметьте, что это рекурсия, PHP будет следовать за всеми “Location: “-header’ами, которые высылаются.)

CURLOPT_SSLVERSION - Передаёт long как параметр, который содержит используемую версию SSL (2 или 3). По умолчанию PHP пытается определить это сам, хотя в некоторых случаях вы обязаны устанавливать это вручную.

CURLOPT_QUOTE - Передаёт массив FTP-команд для выполнения на сервере до выполнения FTP-запроса.

Здесь приведен краткий список основных опций, более полный список высможете найти по адресу http://www.php.net/

В заключении следует отметить что данная библиотека является очень удобной при написании различных web-парсеров, а также грабберов и многих других полезных приложений написанных на php.

Отзывов (5)

  1. Nikitian пишет:

    Замечу, что CURLOPT_FOLLOWLOCATION может быть запрещён на сервере и выдавать варнинг (было на 3 серверах одного хостера).
    Для простой вставки содержимого вызываемого документа надо ставить CURLOPT_RETURNTRANSFER в 0 и тогда никаких выводов переменных не потребуется: что получено будет сразу выведено в стандартный поток вывода.

  2. Василий пишет:

    Я к сожалению имею вышее обрзование,однко ничего понять не смог. Извините. Можно ведь было предложить ту же информацию (возможно ценную) в более удобоваримом варианте.

  3. http_referer пишет:

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

  4. trezub пишет:

    не понятно, как сохранять куки в файл

  5. sowich пишет:

    так же как и в обычном варианте.
    fwrite() к примеру!

Оставьте свой комментарий

Внимание: Осуществляется проверка комментариев, это может отсрочить публикацию, отправлять сообщение повторно нет необходимости.