Разберем доступные типы сURL (расшифровывается как Client URL) запросов на PHP с примерами. Через cURL запросы вы можете передать или получить данные и файлы по протоколам HTTP, FTP, HTTPS, взаимодействуя с другим доменом на удаленном сервере в рамках текущей сессии выполнения PHP скрипта. Запросы cURL в PHP возвращают данные в виде XML, JSON или непосредственно в HTML.
Сначала cURL создавался исключительно для командной строки, но позже разработчиками PHP была написана библиотека, что значительно упростило использование этого инструмента PHP программистами.
Самое распространенное применение таких запросов в PHP — это парсинг страниц сторонних веб-ресурсов, взаимодействие с API других сайтов и так далее. В принципе, получить данные страницы на удаленном сервере можно с помощью функций file_get_contents(), file() или readfile(), но это весь функционал, который они могут дать.
Для того, чтобы построить более сложное взаимодействие, например:
- отправка формы;
- обработка ответа;
- передача, получение или удаление файла;
- отправка или получение cookie
— необходимо использовать Client URL.
Итак, как правильно построить cUrl запрос и какие есть типы запросов разберем далее.
- Отправка cURL запроса PHP
- Получение информации о запросе cUrl
- GET запросы cUrl в PHP
- POST запросы cUrl в PHP
- Мульти запросы cURL в PHP
- Отправка файлов на другой сервер используя cURL
- Методом POST
- Методом PUT
- Методом FTP
- Скачивание файлов
- DELETE запрос для удаления файла
- Запрос через proxy
- Отправить и получить cookie
- Имитация браузера через запросы cURL в PHP
- HTTP авторизация через запросы cURL в PHP
- Basic Authorization
- OAuth авторизация
- Получить HTTP код ответа сервера
Отправка cURL запроса PHP
Формирование cURL запроса состоит из четырех этапов:
- Инициализация
- Указание параметров
- Выполнение команды и получение результата
- Освобождение памяти
Итак, как это должно выглядеть в коде:
Этапы 1,3 и 4 типовые для всех типов запросов. А на этапе 2, в зависимости от указанных параметров, как раз и формируется тот или иной тип запроса.
Получение информации о запросе cUrl
Чтобы получить исчерпывающую информацию о самом запросе используется функция curl_getinfo(). Главным образом эта информация полезна для отладки работы скрипта, в котором выполняются cURL запросы.
Функция возвращает данные в виде массива со следующими ключами:
- url
- content_type
- http_code
- header_size
- request_size
- filetime
- ssl_verify_result
- redirect_count
- total_time
- namelookup_time
- connect_time
- pretransfer_time
- size_upload
- size_download
- speed_download
- speed_upload
- download_content_length
- upload_content_length
- starttransfer_time
- redirect_time
GET запросы cUrl в PHP
Или можно использовать аналог через функцию file_get_contents():
POST запросы cUrl в PHP
Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:
Мульти запросы cURL в PHP
Обычно в скрипте PHP выполнение запросов cUrl производится последовательно, то есть друг за другом. Пока не вернется результат предыдущего запроса, новый не выполнится.
Одной из самых важных особенностью cURL в PHP является возможность осуществлять несколько асинхронных запросов одновременно.
Например, если нужно собрать независимые друг от друга данные с разных сайтов, то можно организовать их параллельный сбор. Можно также произвести несвязанные вычисления или обработку данных через асинхронные запросы к скриптам в отдельных файлах.
Эта особенность позволяет оптимизировать работу скрипта и сократить время его выполнения.
Функция curl_multi_exec() многократно вызывается в цикле с постусловием, где параметр $running имеет значение количества активных соединений.
Чем больше обработчиков в параллельной работе, тем больше сокращается время выполнения скрипта, поэтому нелишним будет внедрить привычку использовать эту возможность cURL в своих скриптах.
Отправка файлов на другой сервер используя cURL
Есть несколько вариантов передачи файлов между серверами.
Методом POST
Таким образом можно отправить один или несколько файлов сразу:
Методом PUT
Методом FTP
Не смотря на то, что в PHP есть библиотека для работы с FTP, все же cURL также позволяет работать по этому протоколу напрямую.
Скачивание файлов
При передаче указателя на открытый файл в параметре CURLOPT_FILE результат выполнения скрипта записывается сразу в файл.
DELETE запрос для удаления файла
Чтобы удалить файл через cURL запрос используется HTTP-метод DELETE:
Запрос через proxy
Когда нужно сделать запрос, подменив при этом источник запроса на промежуточный адрес, то используйте опцию PROXY:
Отправить и получить cookie
Для сохранения куки в файле необходимо указать путь к этому файлу в соответствующих параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR.
Параметр CURLOPT_COOKIE используется для принудительной передачи значения куки:
Имитация браузера через запросы cURL в PHP
Многие сайты защищаются от парсинга, отслеживая данные переменных user agent, referer, cookie. На сервере проверяются эти данные и, если подозрений на парсинг нет, то возвращается страница сайта.
Так как запросы curl в php данные этих переменных не передают, то такая защита от парсинга сайта вернет ошибку 404 или 500. Чтобы этого не происходило, можно сымитировать запрос страницы из браузера, добавив, например, следующие заголовки:
Можно посмотреть через панель для разработчиков заголовки, которые передает браузер при обращение к страницам сайтов и использовать их для запроса cURL в PHP.
HTTP авторизация через запросы cURL в PHP
Basic Authorization
Если на сервере настроена HTTP авторизация, например с помощью .htpasswd, подключится к нему можно с помощью параметра CURLOPT_USERPWD:
OAuth авторизация
Если на сайте реализована работа с OAuth протоколом авторизации, который позволяет
выдать права на действия, которые сам сайт сможет производить на другом ресурсе от
лица, авторизовавшегося и давшего это разрешение, пользователя, тогда запрос cURL в php будет выглядеть следующим образом:
Получить HTTP код ответа сервера
Если требуется прощупать доступность сайта или его отдельной страницы, то можно воспользоваться функцией curl_getinfo с параметром CURLINFO_HTTP_CODE:
Используя объемный арсенал возможностей, которые предоставляют запросы cURL в php, можно решить широкий круг задач, требующих использование кроссплатформенных запросов для выполнения действий или обмена данными между разными сайтами.