Класс 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 с примерами можно здесь.
elin
23.11.2015 @ 12:46 дп
Здравствуйте. как быть, если необходимо отправить файл, но его имя в переменной $_FILES{‘file’][‘name’] нужно задать скриптом при отправке?
admin
23.11.2015 @ 9:21 пп
Покажите часть кода html формы с таким именем поля.
elin
06.02.2016 @ 1:46 пп
Нет, я не про это. схема такая: из формы файл передаётся скрипту на локальном веб сервере. далее скрипт с помощью curl пересылает его другому серверу. чтобы имя передавалось нормальное, приходится переименовывать временный файл, но можно ли при отправке файла изменить его имя уже в отправляемых данных. Если отправлять через socket, это не сложно, а вот через curl я ничего подобного не нашёл.
admin
08.02.2016 @ 8:06 пп
Ну, так вы же на сервере сохраняете файлы для своих нужд верно?
Иначе вы бы их отправляли сразу минуя ваш сервер. Соответственно после сохранения их на своем сервере, и зная их имена не должно возникнуть проблем с дальнейшей их пересылкой.
elin
11.02.2016 @ 9:58 пп
Да, но фишка в том, что сервер принимает файлы только с определёнными расширениями, и если послать ему временный файл, то он его не принимает из-за расширения.
elin
11.02.2016 @ 10:01 пп
А файлы после пересылки сразу удаляются с локального сервера, так как больше не нужны для работы, т.е., скрипт принял файл, отправил его на другой сервер, получил запрос, обработал, показал информацию и файл больше не нужен.
admin
17.02.2016 @ 8:40 пп
Да, как повлиять на тело запроса, я пока с таким тоже не сталкивался. То ли дело, когда сам запрос формируешь.
elin
05.03.2016 @ 7:51 пп
вот и я о том же. ну да ладно, а иначе жизнь будет казаться малиновым вареньем 🙂