Размещено: 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;
Существует несколько форматов тела запроса:
- Формат JSON
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'); curl_setopt($ch, CURLOPT_POSTFIELDS,"{key1:value1,key2:value2}");
- Строка запроса HTTP
curl_setopt($ch, CURLOPT_POSTFIELDS,"key1=value1&key2=value2");
Для построения строки запроса используется функция http_build_query
- Формат массива 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