cURL PHP: что это такое и как им пользоваться?

cURL PHP: что это такое и как им пользоваться?

· PHP и Блог · 5 мин чтения

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

Где используют cURL PHP? Его можно применять для работы с API других сайтов, выполнять простые HTTP запросы и более сложные, например загрузок файлов с FTP.

Мы в этой записи, посмотрим на простые GET/POST запросы и как их делать с помощь.

Важно знать

Настройка запроса 

  • CURLOPT_RETURNTRANSFER — вернуть ответ в виде строки, вместо того, чтобы показывать его сразу
  • CURLOPT_CONNECTTIMEOUT — сколько по времени ждать ответа
  • CURLOPT_TIMEOUT — сколько секунд будет выполняться cURL запрос
  • CURLOPT_USERAGENT — headers (заголовки) для запроса
  • CURLOPT_URL — URL куда будет отправлен запрос
  • CURLOPT_POST — отправить POST запрос
  • CURLOPT_POSTFIELDS — массив POST полей к запросу

Настройки выше используются для изменения параметров отправки запроса. Когда вы не задали никаких параметров для cURL, то у него «появляется куча вопросов».  Например: какой запрос вы хотите выполнить (GET/POST)? Сколько времени выделить на запрос? Куда он должен выполнять и другие подобные.

Другие используемые функции 

  • curl_init() — открывает сеанс cURL
  • curl_close() — закрывает сеанс cURL
  • curl_exec() — выполняет запрос

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

PHP cURL GET

Для начала сделаем GET запрос.

// Для начала скажем, что мы хотим использовать cURL
$curl = curl_init();
// Определение параметров. Ссылку (куда будет делаться запрос) и headers (заголовки)
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://domain.ru/?param=one&param2=two',
    CURLOPT_USERAGENT => 'Sample of cURL'
]);
// Отправляем запрос и сохраняем ответ в $res
$res = curl_exec($curl);
// Закрываем запрос и удаляем инициализацию $curl
curl_close($curl);

В этом запросе мы создаем cURL, и указываем, что нужно вернут ответ со страницы в виде строки CURLOPT_RETURNTRANSFER (не выводя его на экран), указываем ссылку запроса CURLOPT_URL (куда он будет выполнен) и указываем USERAGENT заголовки (не обязательный параметр и его можно удалить). Далее отправляем запрос и получаем ответ. Закрываем cURL и вуаля — у вас теперь есть ответ в $res, который вы теперь можете вывести на экран с помощью echo $var или var_dump($res).

PHP cURL POST

Разница между GET и POST запросами — это синтаксиc для отправки. Для POST можно указать больше параметров, например, поля, которые будут отправляться. Допустим, вы хотите отправить форму на сайте куда делаете запрос, тогда в данном случае вам точно понадобиться POST.

// Для начала скажем, что мы хотим использовать cURL
$curl = curl_init();
// Определение прааметров. Ссылку (куда будет делаться запрос), какие заголовки будут у этого запроса, задаем, что запрос должен быть в формате POST и передаем параметры этого запроса в виде массива 'ключ' => 'значение'. 
curl_setopt_array($curl, [
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_URL => 'http://testcURL.com',
    CURLOPT_USERAGENT => 'Codular Sample cURL Request',
    CURLOPT_POST => 1,
    CURLOPT_POSTFIELDS => [
        'param1' => 'значение1',
        'param2' => 'значение2'
    ]
]);
// Отправляем запроса и сохраняем его в $res
$res = curl_exec($curl);
// Закрываем запрос и удаляем инициализацию $curl
curl_close($curl);

Процедура отправки этого запроса почти идентична тому, что было в GET за исключением двух дополнительных строчек. С помощью CURLOPT_POST мы говорим cURL о том, что хотим отправить POST запрос и затем прописываем параметры для отправки с CURLOPT_POSTFIELDS в виде массива (сначала имя параметра и затем его значение).

В случае, если вы хотите зарегистрироваться на сайте куда вы отправляете запрос и на нем из полей только три, допустим:  first_name (имя), last_name (фамилия), email (почта), тогда поля у вас будут выглядеть следующим образом:

CURLOPT_POSTFIELDS => [
    'first_name' => 'Bologer',
    'last_name' => 'Test',
    'email' => 'admin@bologer.ru'
]

Обратите внимание на то, что если на форме будет стоять капча (проверка на ботов), тогда зарегистрироваться автоматически не получится.

Похожие функции

Для отправки GET запросов так же подойдет file_get_contents() который делает запрос и возвращает то, что удалось получить.

Чем он плох?

  • На некоторых сайтах он заблокирован
  • Некоторые хостинги по умолчанию блокируют эту функцию, поэтому вам придется просить у них включить ее в общий список модулей
  • Мало настроек для отправки запросов

Чем он хорош?

  • Проще чем cURL. Удобно пользоваться, например: file_get_contents('http://google.com')

Альтернативно вы можете воспользоваться функцией copy(), но опять же она не везде доступна.

Пример:

copy('http://example.com/archive.tar.gz', '/tmp/arhive.tar.gz');

Библиотеки

Guzzle PHP HTTP

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

Я вкратце опишу что это и с чем его едят:

Guzzle был создан для того, чтобы упростить процесс отправки HTTP запросов. Зачастую используется для отправки запросов к API и чему угодно в целом.

Реальный пример:

У вас есть API, которое вы недавно разработали и пришло время начать с ним работать. Вы могли бы написать свою библиотеку или даже мини класс для работы с ним, но (1) у вас ушло бы не мало времени, а если бы и мало, то вероятнее всего решение получилось бы не самое лучшее, (2) его нужно постоянно поддерживать и улучшать. В таком случае, лучше использовать готовое решение, которое поддерживается большим сообществом и Guzzle репозитория уже насчитывает 12 тыс. звезд, что очень похвально.

Вы можете спросить: Зачем это нужно, если уже существует куча библиотек? 

Guzzle собрал все самое лучшее в себе, сделать это еще лучше и теперь это самая популярная PHP библиотека для работы с HTTP запросами. Она и вправду крутая, посмотрите только на простоту запроса:

// Создается клиент с базовой URI
$client = new GuzzleHttp\Client(['base_uri' => 'http://bologer.ru/']);
// Теперь вы можете отправить запрос на http://bologe.ru/about-blog, информацю о моем блоге :)
$response = $client->request('GET', 'about-blog');
// Также можно отправить на http://bologer.ru/about, чтобы прочитать обо мне. Guzzle запоминает базовую ссылку и теперь вы можете указывать лишь последующие страницы для удобства
$response = $client->request('GET', 'about');

Круто? Мне очень нравится.

Документация у Guzzle достаточно обширная, каждый вариант не распишешь, да и нужно для этого целый пост, который я в скором времени обязательно напишу :)

Послесловие

Если у вас остались какие-либо вопросы пишите их ниже к этому посту и я буду рад вам помочь. Так же, если у вас есть какие-то поправки по статье и вы увидели где-то ошибку или хотите добавить что-то буду рад вас выслушать.

Читать далее