В этой записи, я покажу на примерах как пользоваться 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()
— открывает сеанс cURLcurl_close()
— закрывает сеанс cURLcurl_exec()
— выполняет запрос
Функции выше используются для создания запроса, его запуска и закрытия.
PHP cURL GET
Для начала сделаем GET
запрос.
// Для начала скажем, что мы хотим использовать cURL $curl = curl_init(); // Определение параметров. Ссылку (куда будет делаться запрос) и headers (заголовки) curl_setopt_array($curl, [ CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => 'http://domain.ru/?param=one¶m2=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.
Я вкратце опишу что это и с чем его едят:
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 достаточно обширная, каждый вариант не распишешь, да и нужно для этого целый пост, который я в скором времени обязательно напишу :)
Послесловие
Если у вас остались какие-либо вопросы пишите их ниже к этому посту и я буду рад вам помочь. Так же, если у вас есть какие-то поправки по статье и вы увидели где-то ошибку или хотите добавить что-то буду рад вас выслушать.