что такое curl и зачем он нужен в php
PHP CURL – функции и примеры использования
Предлагаю немного поговорить о языке программирования PHP, а конкретно затронуть тему расширения CURL, т.е. возможность взаимодействовать с различными серверами по различным протоколам из самого скрипта PHP.
Перед тем как приступить к рассмотрению curl хочу напомнить, что язык PHP мы с Вами уже затрагивали, например, в материале про выгрузку в Excel на PHP или возможность аутентификации на PHP, а теперь давайте поговорим о возможности посылать запросы на PHP.
Что такое CURL?
CURL – это библиотека функций PHP, с помощью которой можно посылать запросы, например, HTTP, из PHP скрипта. CURL поддерживает такие протоколы как HTTP, HTTPS, FTP и другие. Посылать HTTP запросы можно методами GET, POST, PUT.
CURL может пригодиться в случаях когда необходимо вызвать удаленный скрипт и получить результат или просто сохранить HTML код вызываемой страницы, в общем каждый может найти свое применение но смысл один это то что можно послать запросы в процессе выполнения скрипта.
Подключение библиотеки CURL в PHP
Для того чтобы использовать библиотеку CURL ее соответственно нужно подключить.
Примечание! В качестве примера мы будем использовать PHP 5.4.39 на Windows 7, а в качестве Web-сервера у нас будет выступать Apache 2.2.22.
Первое что нужно сделать, это скопировать библиотеки ssleay32.dll, libeay32.dll, libssh2.dll они расположены в директории с PHP, в системный каталог Windows, а именно в C:\Windows\System32.
Затем в php.ini подключить библиотеку php_curl.dll, т.е. раскомментировать следующую строку
Библиотека не подключена
Все, перезапускаем Apache, вызываем функцию phpinfo() и в случае успешного подключения у Вас должен появиться раздел curl
Если его нет, то это означает только одно, что библиотека не загрузилась, самая распространенная причина этого небыли скопированы вышеперечисленные DLL в системный каталог Windows.
Пример CURL – запрашиваем удаленную страницу для вывода на экран
В данном примере мы просто запросим удаленную страницу по протоколу HTTP методом GET и выведем ее содержимое на экран.
У нас имеется каталог test в нем 2 PHP файла это test_curl.php и test.php, где test_curl.php и есть скрипт где мы будем использовать curl, а test.php удаленный скрипт который мы будем вызывать. Код я подробно прокомментировал.
Код test_curl.php
Код test.php
В итоге если вы запустите test_curl.php у Вас выведется на экран надпись «Заголовок 1», можете поэкспериментировать с передачей параметров id (в данном случае 2 или 3).
Пример CURL – вызываем удаленный скрипт и получаем результат
Сейчас давайте попробуем вызвать скрипт и получить результат, для того чтобы потом его обработать, для примера давайте использовать метод POST. Названия файлов оставим такими же.
Код test_curl.php
Код test.php
И если мы запустим test_curl.php то на экран у нас выведется 111, т.е. 1.11 полученное в результате обращения к удаленному скрипту, умноженное на 100.
А теперь давайте поговорим о функциях и константах к ним.
Часто используемые функции CURL и константы
Подробнее о функциях CURL и константах к ним можете посмотреть на официальном сайте PHP — php.net
На этом все, для начинающих я думаю достаточно Удачи!
cURL в PHP: примеры POST, GET запросов с headers, cookie, JSON и многопоточностью
В этой статье мы рассмотрим эффективные приемы работы с cURL, отправление POST, GET и т.д. запросов, работу с cookie, заголовки, JSON а также в конце статьи будут некоторые полезные инструменты, которые могут значительно облегчить вам работу с HTTP запросами.
GET запрос при помощи cURL
Для того, чтобы отправить запрос, нужно создать объект при помощи функции curl_init(), а затем следует настроить его.
Все настройки, которые вы можете найти по этой ссылке. Там вы найдете опции, которые мы будем устанавливать функцией curl_setopt, в дальнейших примерах.
Пример простого GET запроса при помощи cURL:
Если в результате сервер вернет нам редирект, то мы по нему автоматически не перейдем. А иногда это бывает полезно. Чтобы cURL автоматически шел по редиректу нужно установить опцию CURLOPT_FOLLOWLOCATION.
С установленной опцией скрипт автоматически перейдет по вернувшемуся редиректу и вернет ответ уже с итоговой страницы.
POST запрос при помощи cURL
Теперь давайте отправим post запрос на адрес https://httpbin.org/anything
Отлично, с GET и POST запросами в cURL мы немного освоились. Теперь разберемся с заголовками, которые мы можем отсылать в запросе.
Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON
cURL: POST запрос в формате JSON
Отличия конфигурации JSON запроса от обычного POST запроса заключается в том, что мы кодируем поля при помощи json_encode() И добавляем заголовок Content-Type: application/json
cURL: GET запрос в формате JSON
GET запрос в формате JSON отправляется так же как и POST запрос, просто нужно CURLOPT_CUSTOMREQUEST установить в ‘GET’
cURL и другие виды HTTP запросов: PUT, DELETE, HEAD, PATCH, OPTIONS, CONNECT и т.д.
Стоп, Дмитрий, прекрати выдумывать виды запросов!
Ничего я не выдумываю: HTTP протокол предполагает множество типов HTTP запросов просто POST и GET являются более распространенными.
Чтобы отправить PUT запрос, нужно установить опцию CURLOPT_PUT таким образом:
Это делается по тому же принципу, как и CURLOPT_POST. Но что делать с остальным зоопарком запросов? Разве у cURL есть CURLOPT_DELETE или CURLOPT_HEAD? Нет.
Для того, чтобы отправлять другие виды запросов есть другая опция: CURLOPT_CUSTOMREQUEST
Вместо строки curl_setopt($curl, CURLOPT_POST, true); мы явно задаем имя запроса опцией CURLOPT_CUSTOMREQUEST:
Замечание: Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.
Как получить заголовки ответа
В предыдущем примере мы научились посылать заголовки. Самый правильный способ принять заголовки:
Иногда можно встретить другой вариант получения заголовков ответа. К сожалению, они не совсем правильные и могут работать некорректно в некоторых случаях.
Рассмотрим такой пример:
Мы сначала определяем размер заголовка, с помощью CURLINFO_HEADER_SIZE затем вырезаем его из ответа. К сожалению, это может не срабатывать, когда используется прокси или в некоторых случаях редиректа.
Скачивание больших файлов с помощью cURL
Для того, чтобы скачать большой файл пригодится этот способ:
Обратите внимание, если вы будете использовать file_get_contents для скачивания файлов, то файл сначала загружается в оперативную память, а потом сохраняется на диск. Поэтому если файл действительно большой, то скорее всего вашему серверу не хватит памяти. Также к памяти будет требователен следующий код:
Здесь мы скачиваем файл при помощи cURL в оперативную память, а затем сохраняем его на диск. Не смотря на то, что этот способ не годится для скачивания больших файлов, с помощью него можно вполне сохранить простую веб страницу.
Параллельные cURL запросы в PHP
Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:
И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.
Как выполнить 3 запроса одновременно? В этом нам поможет curl_multi_
Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.
Такие параллельные запросы выполняются значительно быстрее чем поочередные.
cURL запросы с сохранением и загрузкой cookie из файла
cURL позволяет нам установить cookie при передачи запросов, а также автоматически принимать и устанавливать cookie, которые нам возвращает сервер, сохраняя их между запросами.
Давайте рассмотрим такой пример:
Теперь cookie у нас хранятся в файле cookie.txt в директории со скриптом (если вы ничего не меняли). Если мы совершаем повторные запросы, то cURL автоматически берет и отправляет cookie на сервер, как и обычный браузер. Таким образом мы можем авторизироваться на сайте и сохранить сеанс между запросами.
Передача cookie без файлов
Иммитация браузера с помощью cURL
Иногда сайт, к которому мы обращаемся может фильтровать запросы, защищаясь от парсинга. Если для этого используются упрощенные способы защиты, например проверка User-Agent, то мы можем легко притвориться, что являемся реальным польователем, который взаимодействует с сайтом через браузер, мы можем послать заголовки и cookie, которые обычно посылает браузер.
В данном примере установлены заголовки, которые посылает Chrome.
В простых ситуациях этого хватает. Но если используется защита при помощи javascript или что-то более продвинутое, то здесь cURL бессилен, и следует использовать либо BAS либо Zennoposter. Либо если вы хотите попытать счастье с PHP, то Selenium.
Не используйте эти знания в противоправных целях.
cURL запросы через прокси
Простой пример для отправки запросов через proxy. Если ваш прокси предполагает авторизацию, то раскомментируйте соответствующие строчки.
Отправка файлов
Авторизация с помощью cURL
HTTP Авторизация
Чтобы с помощью cURL авторизироваться на сайте, который использует Basic HTTP-аутентификацию нужно установить опцию CURLOPT_USERPWD, в которой будет наш логин и пароль.
OAuth авторизация
Авторизация через форму
Давайте применим полученные нами знания и авторизируемся на каком-нибудь сайте. Для этого нужно посмотреть куда форма отправляет данные и отправить туда то же самое.
Допустим на сайте есть такая форма:
Тогда наш cURL запрос должен быть сформирован так:
Автоматическое построение запросов
Перевод консольной команды curl в PHP
И вот еще один сервис, который переводит консольную команду curl в PHP: https://incarnate.github.io/curl-to-php/
Так вы можете создать простые запросы на cURL в PHP не создавая их вручную.
Лайфхак
В консоли браузера, во вкладке сеть, вы можете кликнуть правой кнопкой мыши и скопировать любой запрос в виде команды cURL, а потом с помощью сервиса curl-to-php перевести запрос в PHP. Теперь вы вообще можете сконвертировать в cURL абсолютно любой запрос, который посылает ваш браузер.
Как работать с cURL гораздо проще
Вы можете спросить: почему у cURL такие кривые и страшные методы? У вас может возникнуть желание взять и создать обертку для работы с cURL, чтобы вы могли не писать каждый раз большие куски некрасивого кода, а писать все проще, например так:
К счастью, такая обертка уже написана и найти ее можно здесь: https://github.com/php-curl-class/php-curl-class
Просто установите ее при помощи: composer require php-curl-class/php-curl-class и не работайте с кривыми кусками кода, которые таковы вероятно потому, что cURL изначально консольное приложение.
POST и GET запросы без cURL
С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.
При помощи file_get_contents мы также можем отправить POST запрос.
Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php
Другие инструменты для работы с запросами в PHP
Для работы с запросами есть еще более мощный инструмент: Guzzle
Несколько примеров на Guzzle
GET запросы на Guzzle
Разные типы запросов на Guzzle
Асинхронные запросы на Guzzle
Если интересно, то читайте: Guzzle Quick Start
Пишите комментарии, если что-то осталось непонятно.
cURL PHP: что это такое и как им пользоваться?
В этой записи, я покажу на примерах как пользоваться cURL, где его применяют и почему вам стоит в нём разобраться, если вы еще этого не сделали.
Где используют cURL PHP? Его можно применять для работы с API других сайтов, выполнять простые HTTP запросы и более сложные, например загрузок файлов с FTP.
Мы в этой записи, посмотрим на простые GET / POST запросы и как их делать с помощь.
Важно знать
Настройка запроса
Настройки выше используются для изменения параметров отправки запроса. Когда вы не задали никаких параметров для cURL, то у него «появляется куча вопросов». Например: какой запрос вы хотите выполнить ( GET / POST )? Сколько времени выделить на запрос? Куда он должен выполнять и другие подобные.
Другие используемые функции
Функции выше используются для создания запроса, его запуска и закрытия.
PHP cURL GET
Для начала сделаем GET запрос.
PHP cURL POST
Процедура отправки этого запроса почти идентична тому, что было в GET за исключением двух дополнительных строчек. С помощью CURLOPT_POST мы говорим cURL о том, что хотим отправить POST запрос и затем прописываем параметры для отправки с CURLOPT_POSTFIELDS в виде массива (сначала имя параметра и затем его значение).
В случае, если вы хотите зарегистрироваться на сайте куда вы отправляете запрос и на нем из полей только три, допустим: first_name (имя), last_name (фамилия), email (почта), тогда поля у вас будут выглядеть следующим образом:
Обратите внимание на то, что если на форме будет стоять капча (проверка на ботов), тогда зарегистрироваться автоматически не получится.
Похожие функции
Для отправки GET запросов так же подойдет file_get_contents() который делает запрос и возвращает то, что удалось получить.
Чем он плох?
Чем он хорош?
Библиотеки
Чтобы не создавать новый велосипед, лучше всего воспользоваться готовым решением в виде Guzzle.
Я вкратце опишу что это и с чем его едят:
Guzzle был создан для того, чтобы упростить процесс отправки HTTP запросов. Зачастую используется для отправки запросов к API и чему угодно в целом.
У вас есть API, которое вы недавно разработали и пришло время начать с ним работать. Вы могли бы написать свою библиотеку или даже мини класс для работы с ним, но (1) у вас ушло бы не мало времени, а если бы и мало, то вероятнее всего решение получилось бы не самое лучшее, (2) его нужно постоянно поддерживать и улучшать. В таком случае, лучше использовать готовое решение, которое поддерживается большим сообществом и Guzzle репозитория уже насчитывает 12 тыс. звезд, что очень похвально.
Вы можете спросить: Зачем это нужно, если уже существует куча библиотек?
Guzzle собрал все самое лучшее в себе, сделать это еще лучше и теперь это самая популярная PHP библиотека для работы с HTTP запросами. Она и вправду крутая, посмотрите только на простоту запроса:
Круто? Мне очень нравится.
Документация у Guzzle достаточно обширная, каждый вариант не распишешь, да и нужно для этого целый пост, который я в скором времени обязательно напишу 🙂
Послесловие
Если у вас остались какие-либо вопросы пишите их ниже к этому посту и я буду рад вам помочь. Так же, если у вас есть какие-то поправки по статье и вы увидели где-то ошибку или хотите добавить что-то буду рад вас выслушать.
Что такое curl и зачем он нужен в php
PHP поддерживает libcurl, библиотеку, созданную Daniel»ом Stenberg»ом, которая даёт возможность соединяться с серверами различных типов и по разным протоколам.
libcurl в настоящее время поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap.
libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP (это можно сделать также РНР-расширением ftp), загрузку на основе форм HTTP, прокси, куки и аутентификацию user+password.
Эти функции были введены в PHP 4.0.2.
curl_init
Описание
resource curl_init([string url])
Функция curl_init() инициализирует новую сессию и возвратит CURL-дескриптор для использования в функциях curl_setopt(), curl_exec() и curl_close(). Если необязательный параметр url предоставлен, то опция CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции curl_setopt().
curl_setopt
Описание
bool curl_setopt (resource ch, string option, mixed value)
Функция curl_setopt() устанавливает опции для CURL-сессии, идентифицируемой параметром ch. Параметр option является опцией, которую вы хотите установить, а value это значение опции option.
Параметр value должен быть long для следующих опций (специфицированных параметром option):
Параметр value должен быть строкой для следующих значений параметра option:
Следующие опции ожидают дескриптора файла, который получается с помощью функции fopen():
Параметр value должен быть функцией следующего вида long write_callback (resource ch, string data) для следующих значений параметра option:
Параметр value должен быть функцией следующего вида string read_callback (resource ch, resource fd, long length)<> для следующих значений параметра option:
Применение cURL и libcurl в php
Вступление
Это руководство предназначено для тех web-разработчиков, которые хотят автоматизировать передачу файлов по сети либо взаимодействовать с другими Интернет — сервисами. Для чтения этой главы вам необходимо владеть пониманием принципа работы стратегии клиент — сервер и знать основы синтаксиса PHP.
cURL и libcurl — библиотеки, позволяющие серверу передавать файлы на удаленный компьютер, используя множество Интернет протоколов. Библиотеки имеют очень гибкую настройку и позволяют выполнить практически любой удаленный запрос. Используя их, web-сервер может выступать полноценным клиентом любого основанного на HTTP протоколе сервисе, к примеру: XML-RPC, SOAP, или WebDAV.
В этой статье будет рассказано о том, что такое cURL, как его использовать из командной строки, и о его применении в PHP.
Что такое cURL и libcurl
cURL является сокращением от «Client URLs». Он был разработан Daniel Stenberg в 1998 году как утилита, работающая из командной строки. Libcurl — переносимая библиотека, предоставляющая простой API-интерфейс к функциональности cURL. Библиотека безопасна в мультипоточной среде, совместима с IPv6 и поддерживает постоянные соединения. Интерфейс взаимодействия с php был добавлен Sterling Hughes.
cURL и libcurl могут использоваться для передачи информации с использованием таких протоколов, как HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET и FILE. Реализована поддержка практически всех *nix систем, а также Windows, OS/2, BeOS и некоторых других.
Библиотека curl — Open Source продукт с оригинальной MIT/X лицензией, позволяющей использовать этот пакет в любых: как коммерческих, так и некоммерческих целях, включать ее в свой дистрибутив (даже если он распространяется без открытого исходного кода).
Необходимо понимать, что cURL не имеет ничего общего с Curl Corporation, являющейся коммерческим производителем языка программирования Curl.
Инсталляция cURL
Для работы в PHP версии 4.2.3 и выше вам необходим cURL версии не ниже 7.9.0. Для работы в PHP версии 4.3.0 и выше вам необходим cURL версии не ниже 7.9.8.