Размещено: 2024-02-02 16:37:41

Теги: php

ОСНОВЫ БИБЛИОТЕКИ CURL PHP

cURL - клиентская библиотека работы с URL, используется в языке PHP для передачи и получения различных данных форматах, JSON, XML, обычном HTML, а так же получения, парсинга и загрузки файлов.

В общем виде работа cURL выглядит так: Инициализация сеанса -> Настройка запроса -> Выполнение запроса -> Закрытие сеанса.

Простой GET запрос

При установке CURLOPT_RETURNTRANSFER в значение true или 1, константа сообщает cURL вернуть ответ из HTTP-запроса в виде строки, которую затем можно сохранить в переменной или обработать по мере необходимости. Если этот параметр не задан или имеет значение false, ответ на HTTP-запрос будет отправлен непосредственно в поток вывода (например, в окно браузера или файл, установленный параметром CURLOPT_FILE).

$ch = curl_init(); //Инициализирует сеанс cURL
curl_setopt($ch, CURLOPT_URL, "http://spbmuz.ru"); //url к которому обращаемся
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //сообщаем, что хотим получить ответ в переменную, а не выводить сразу
$response=curl_exec($ch); //Выполняет запрос cURL
curl_close($ch); //Завершает сеанс cURL

Работа с заголовками

curl_setopt($ch, CURLOPT_HTTPHEADER, array("Key: $key","Signature: $sign"));

Работа с временем загрузки

Если тайм-аут запроса не указан явно, то по умолчанию он установлен "в бесконечность". Поэтому его всегда необходимо указывать. Иначе есть риск того, что при зависании стороннего сервера зависнет и тот который осуществляет запросы к нему. Особенно актуально в бесконечных консольных скриптах. Задается в секундах.

curl_setopt($ch, CURLOPT_TIMEOUT, 10);

Запросы DELETE

curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE');

POST запросы

Чтобы сделать POST-запрос, нужно установить параметры CURLOPT_POST и CURLOPT_POSTFIELDS.

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/api/resource");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "name=value");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

Существует несколько форматов тела запроса:

  1. Формат JSON
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json');
curl_setopt($ch, CURLOPT_POSTFIELDS,"{key1:value1,key2:value2}");
  1. Строка запроса HTTP
curl_setopt($ch, CURLOPT_POSTFIELDS,"key1=value1&key2=value2");

Для построения строки запроса используется функция http_build_query

  1. Формат массива POST
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: multipart/form-data');
curl_setopt($ch, CURLOPT_POSTFIELDS, array("key1"=>"value1", "key2"=>"value2");

PUT запрос

HTTP-метод PUT используется в REST API для обновления данных. Нечто среднее между DELETE И POST.

Нужно указать как CURLOPT_CUSTOMREQUEST, так и CURLOPT_POSTFIELDS.

$data = array(
  'name'  => 'Иван',
  'price' => 0.02
);    
 
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);  
 
echo $html;

Работа с ошибками и статусами ответа сервера

curl_getinfo - Получает информацию о конкретной передаче

Выводим статус ответа сервера

$response=curl_exec($ch);
$httpcode=curl_getinfo($ch, CURLINFO_HTTP_CODE);

if(!($httpcode>=200 && $httpcode<300))
{
  echo 'error: '.$httpcode.'<br>';
}

Либо вывод ошибки

echo $result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}

Либо можно совместить одно с другим и записать все это немного иначе

$info = curl_getinfo($ch);
if (curl_errno($ch) || substr($info['http_code'],0,1) !== '2') {
// вызов пользовательского исключения
throw new CustomException(curl_error($ch), $data, $info);
}

Работа с useragent и referer

На многих сайтах стоит примитивная защита от парсинга и сайт работает только при указанном user_agent, а вложенные файлы - js, картинки, ajax-запросы обязательно требуют наличия referer

curl_setopt($ch, CURLOPT_REFERER, $referer);
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);

Работа с cookie

Передать значение куки можно через параметр CURLOPT_COOKIE, в том же виде в котором мы из вытащили из браузера:

curl_setopt($ch, CURLOPT_COOKIE, 'name=john; login=admin');

Чтобы curl сохранил куки в файл:

curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');

Чтобы curl передал серверу куки из файла:

curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');

Их можно использовать вместе. То есть первый запрос делается только с записью, а последующие с начиная со второго запроса с выдачей и записью:

curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');

Тогда curl будет читать и записывать в один и тот же файл, аналогично тому как это происходит в браузере.


На эту страницу чаще всего попадают по запросам: курл, curl