Класс CURL для передачи данных на PHP

В практически любом языке программирования, имеются библиотеки для передачи данными между сервером и клиентом. И PHP не стал исключением. PHP поддерживает работу с библиотекой libcurl. Разработчиком и правообладателем данной библиотеки является Daniel Stenberg. Библиотека имеет очень богатые возможности для работы с различными протоколами, с SSL сертификатами, а также обладает поддержкой использования прокси-серверов.

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

  • работа с HTTP и HTTPS протоколами;
  • работа c SSL сертификатами;
  • обработка cookie;
  • возможность выбора исходящего сетевого интерфейса (IP адреса);
  • работа через прокси.

Описание методов

  • CURL __construct ()

    Метод является конструктором и вызывается при создании объекта класса. Здесь происходит указание стандартных заголовков запроса.

  • string get (string $url)

    Данный метод используется для отправки запроса к указанному хосту методом GET. В качестве параметра метод принимает строку содержащую адрес ресурса.

  • string post (string $url, string $postparams)

    Этот метод следует использовать для отправки запроса к указанному хосту методом POST. Если второй параметр является массивом, то данные будут отправлены в формате multipart/form-data.

  • void set_httpget (bool $httpget)

    Метод используется если необходимо сбросить метод HTTP-запроса в GET. Метод принимает один параметр true или false.

  • void set_referer (string $referer)

    Для установки источника запроса (HTTP заголовок: Referer) следует воспользоваться данным методом, и в качестве параметра, передать строку содержащую источник запроса.

  • void set_autoreferer (bool $autoreferer)

    При вызове метода с параметром установленным в значение true, источник запроса (HTTP заголовок: Referer) при переадресациях (HTTP заголовок: Location), будет устанавливаться автоматически.

  • void set_useragent (string $agent)

    Метод позволяет установить название user-agent (HTTP заголовок: User-Agent).

  • void add_cookies (array $cookies)

    Метод добавляет cookies к уже существующей коллекции. Для добавления cookies, следует в качестве параметра передать массив с элементами вида: имя => значение.

  • void delete_cookies (array $cookies)

    Данный метод позволяет произвести удаление cookies по их именам. В качестве параметра выступает массив имен требуемых для удаления cookies.

  • array get_cookies ()

    Метод возвращает все установленные cookies в виде массива.

  • void clear_cookies ()

    Метод производит очистку всех cookies.

  • void add_httpheaders (array $headers)

    С помощью данного метода можно произвести установку дополнительных HTTP заголовков. Для этого в качестве параметра необходимо передать массив с элементами вида: имя => значение.

  • void delete_httpheaders (array $headers)

    Данный метод позволяет произвести удаление HTTP заголовков по их именам. В качестве параметра необходимо передать массив включающий имена HTTP заголовков необходимых для удаления.

  • array get_httpheaders ()

    Метод возвращает все установленные HTTP заголовки в виде массива.

  • void clear_httpheaders ()

    Метод очищает все HTTP заголовки.

  • void set_encoding (string $encoding)

    Данный метод устанавливает кодировку (HTTP заголовок: Accept-Encoding). В качестве параметра метод принимает строку содержащую тип кодировки.

  • void set_interface (string $interface)

    Этот метод устанавливает исходящий сетевой интерфейс для его дальнейшего использования. Имеет смысл в использовании, если сервер имеет в своем распоряжении несколько различных IP адресов. В качестве параметра выступает строка, содержащая IP адрес.

  • void set_writeheader (resource $writeheader)

    Использование данного метода позволит вывести header-часть полученного ответа в файл. В качестве параметра выступает дескриптор файла.

  • void set_followlocation (int $followlocation)

    Для включения или отключения автоматической обработки переадресации (HTTP заголовок: Location), следует передать в качестве параметра 0 или 1 соответственно.

  • void set_returntransfer (int $returntransfer)

    Для того чтобы включить или отключить непосредственный вывод информации сразу после обработки HTTP запроса, в качестве параметра данному методу требуется передать 0 или 1.

  • void set_ssl_verifypeer (int $ssl_verifypeer)

    Для запрета проверки сертификата удаленного сервера, необходимо в качестве параметра передать 0. Если значение параметра будет нулевым, то возможно появится необходимость вызвать метод set_ssl_verifyhost с параметром равным нулю или единице.

  • void set_ssl_verifyhost (int $ssl_verifyhost)

    При вызове метода с параметром равным 1, будет происходить проверка на существование имени сертификата, а в случае если параметр будет установлен в значение 2, то будет происходить еще и проверка соответствия имени хоста.

  • void set_sslcert (string $sslcert)

    В качестве параметра методу требуется передать строку содержащую имя сертификата PEM.

  • void set_sslkey (string $sslkey)

    Данный метод в качестве параметра принимает строку содержащую имя файла с закрытым ключом SSL.

  • void set_cainfo (string $cainfo)

    Данному методу в качестве параметра передается строка содержащая имя файла одного или нескольких сертификатов, необходимых для проверки подлинности удаленного сервера.

  • void set_timeout (int $timeout)

    Метод позволяет установить максимальное время выполнения функций в секундах. В качестве параметра требуется передать ненулевое значение. По умолчанию параметр установлен в 0.

  • void set_connect_time (int $connect_time)

    Для установки максимального числа секунд отводимого для ожидания соединения с хостом, в качестве параметра требуется передать ненулевое значение. Требуется установить значение в ноль, если желаете, чтобы ожидание было бесконечным. По умолчанию параметр установлен в 0.

  • void set_cookiefile (string $cookiefile)

    Данный метод имеет смысл использовать, если требуется сохранять полученные cookies в файл. В качестве параметра метод принимает строку содержащую имя файла.

  • void set_proxy (string $proxy [, string $proxy_type = false])

    Метод позволяет произвести настройку адресации для использования прокси-сервера. В качестве первого параметра метод принимает строку содержащую имя прокси-сервера и номер порта в формате hostname:port. Если ожидается использование прокси-сервера типа SOCKS, то в качестве значения второго параметра требуется указать “socks5”.

  • void set_proxy_auth (string $proxy_user_data)

    Если прокси-сервер требует авторизации, то указать необходимые для нее данные нужно с помощью данного метода. В качестве параметра метод принимает строку содержащую логин и пароль в формате [username]:[password].

  • void set_verbose (int $verbose)

    Если имеется необходимость, в получении отчета обо всех действиях библиотеки libcurl, то требуется передать в качестве параметра ненулевое значение.

  • int get_error ()

    Данный метод возвращает код последней ошибки библиотеки libcurl.

  • string get_location ()

    Метод возвращает значение HTTP заголовка Location.

  • bool get_http_code ()

    Данный метод возвращает код ответа сервера.

  • int get_speed_download ()

    В результате вызова этого метода, будет получено значение средней скорости загрузки. Однако следует помнить, что чем больше объем загружаемых данных, тем точнее будет полученный результат.

  • string get_content_type ()

    Метод возвращает значение HTTP заголовка Content-Type или NULL, если заголовок на стороне сервера был сформирован не правильно.

  • string get_url ()

    Данный метод возвращает последний использованный URL.

  • void __destruct ()

    Метод деструктор. Вызывается автоматически.

Примеры использования

Рассмотрим основные примеры по использования класса CURL. А именно работу с GET и POST запросами, обработку cookies, работу с HTTP заголовками и настройкой прокси.

Инициализация

В начале мы должны указать путь к модулю и создать экземпляр класса cURL.

require_once ('путь к модулю');
$curl = new curl ();
GET запрос

В результате это примера мы получим с тело документа расположенного по адресу: http://ya.ru.

echo $curl->get('http://ya.ru');
POST запрос

Для отправки данных методом POST с использованием типа application/x-www-form-urlencoded, следует использовать ниже приведенный пример.

echo $curl->post('http://example/test.php', 'password=12345&login=mylogin');

Однако, если необходимо отправить данные, используя тип multipart/form-data, то следует использовать другой подход. Ниже описанный пример демонстрирует отправку файла:

$fName = dirname ( __FILE__ ) . "/test.zip";

// Проверяем существует ли файл
if ( @file_exists($fName)) {	
	echo $curl->post('http://example/test.php', array('file' => "@$fName"));
}
HTTP заголовки

Объявляем массив и добавляем в него все необходимые заголовки

$headers = array (
	'Accept-Encoding' => 'gzip, deflate',
	'Connection' => 'keep-alive'
);

$curl->add_httpheaders($headers);
Работа с cookie

Объявляем массив и добавляем в него все необходимые cookies

$cookies = array (
	'fdi' => '1',
	'session' => 'a7103cffc24c3c45683dc338b060000e'
);

Устанавливаем массив с cookies

$curl->add_cookies($cookies);

Смотрим какие cookies установлены

$result = $curl->get_cookies();

Результат:

array
(
    [fdi] => 1
    [session] => a7103cffc24c3c45683dc338b060000e
)
// Удаляем cookie fdi
$curl->delete_cookies(array('fdi'));

Смотрим какие cookies установлены

$result = $curl->get_cookies();

Результат:

array
(
    [session] => a7103cffc24c3c45683dc338b060000e
)

Также следует отметить. Что cookies указанные в заголовке сервера Set-Cookie, добавляются в коллекцию автоматически.

Настройка прокси-сервера

Указываем адрес прокси-сервера

$curl->set_proxy("217.42.14.1:8080");

Иногда может потребоваться указать логин и пароль

$curl->proxy_user_data("login:password");

Скачать класс CURL с примерами можно здесь.