.
Собрание интересных и полезных материалов по множеству направлений — без ограничений в темах.
Позвонить: +7 (384) 445-09-33cURL — это инструмент, позволяющий взаимодействовать с различными серверами и поддерживающий множество протоколов: HTTP, FTP, TELNET и др. Изначально cURL — это служебная программа для командной строки. Но, к счастью для нас, PHP поддерживает работу с библиотекой cURL. В этой статье мы рассмотрим нетривиальные примеры работы с cURL.
Почему cURL?На самом деле, есть много других способов отправить запрос на другой сервер чтобы, например, получить содержимое страницы. Многие, в основном из-за лени, используют простые PHP функции, вместо cURL:
Однако они не позволяют эффективно обрабатывать ошибки. Также есть ряд задач, которые им вовсе не под силу — например, работа с cookies, авторизация, post запросы, загрузка файлов.
cUrl — мощный инструмент, который поддерживает множество протоколов и предоставляет полную информацию о запросе.
Основы cUrlПрежде чем перейти к сложным примерам, рассмотрим базовую структуру cURL запроса в PHP. Для выполнения cURL запроса в PHP необходимо сделать 4 основных шага:
В основном в этой статье мы будем рассматривать шаг №2, так как там происходит основная магия. Список cURL опций очень большой, поэтому все опции рассматривать сегодня мы не будем, а используем те, которые пригодятся для решения конкретных задач.
Отслеживание ошибокПри необходимости, вы можете добавить следующие строки для отслеживания ошибок:
Обратите внимание, мы используем «===» вместо «==», т.к. надо отличать пустой ответ сервера от булевского значения FALSE, которое возвращается в случае ошибки.
Получение информации о запросеДругой необязательный шаг — получение информации о cURL запросе, после его выполнения.
В результате вы получите массив со следующей информацией:
В этом примере мы напишем скрипт, который будет определять перенаправления в зависимости от разных настроек браузера. Например, некоторые сайты перенаправляют посетителей с мобильных устройств, посетителей из других стран.
Мы будем использовать опцию CURLOPT_HTTPHEADER для установки наших собственных заголовков, включая User-Agent и язык и посмотрим, куда перенаправляют нас сайты.
В цикле проверяем браузеры для каждого урла. Сперва мы устанавливаем опции для нашего запроса: URL и тестируемый браузер и язык.
Т.к. мы установили специальную опцию, результат выполнения запроса будет содержать только HTTP заголовки. С помощью простого регулярного выражения мы можем проверить содержит ли ответ строку «Location:».
Результат выполнения скрипта:
Отправляем POST запросыПри выполнении GET запросов данные можно передавать в строке запроса. Например, когда вы ищете в гугле, ваш запрос передается в URL:
Чтобы получить результат этого запроса, вам даже не понадобится cURL, вы можете быть ленивым и использовать «file_get_contents()».
Но некоторые HTML формы используют метод POST. В таком случае данные отправляются в теле сообщения запроса, а не в самом URL.
Напишем скрипт, который будет отправлять POST запросы. Для начала создадим простой PHP файл, который будет принимать эти запросы и возвращать отправленные ему данные. Назовем его post_output.php :
Далее напишем PHP скрипт, который отправит cURL запрос:
Данный скрипт выведет:
Данный скрипт отправил POST запрос файлу post_output.php. который вывел содержимое массива $_POST и мы получили этот ответ с помощью cURL.
Загрузка файловЗагрузка файлов очень похожа на предыдущий скрипт, т.к. загрузка файлов всегда выполняется с помощью POST запросов.
Так же как и в предыдущем примере, создадим файл, который будет принимать запросы, upload_output.php :
И сам скрипт, загружающий файлы:
Если вы хотите загрузить файл, все что необходимо — это передать путь к нему, так же как обычный параметр POST запроса, поставив вначале «@». Результат работы скрипта:
Multi cURLОдна из продвинутых возможностей cURL в PHP — это возможность выполнения нескольких запросов одновременно и асинхронно.
В обычных условиях скрипт останавливается и ждет выполнения запроса. И если вам надо выполнить много запросов, то это может занять много времени, т.к. вы будете выполнять последовательно. Это ограничение можно обойти:
Идея состоит в том, что вы можете создать множество cURL дескрипторов, объединить их под одним мульти-дескриптором и выполнять их асинхронно.
Сначала все как и с обычным cURL запросом — создается дескриптор (curl_init()), задаются параметры (curl_setopt()). Далее создается мульти-дескриптор (curl_multi_init()) и добавляются ранее созданные обычные дескрипторы (curl_multi_add_handle()). Вместо обычного вызова curl_exec() мы будем многократно вызывать curl_multi_exec() данная функция информирует нас о количестве активных соединений с помощью второго параметра — $running. Поэтому цикл работает пока $running не станет равным 0. И, конечно, после окончания работы необходимо освободить ресурсы.
В данном примере мы просто выводим результат запросов в STDOUT. Рассмотрим нетривиальный случай применения multi cURL.
Проверка внешних ссылок в WordPressПредставьте себе блог с большим количеством постов, содержащих ссылки на внешние сайты. Некоторые из этих ссылок могут быть не рабочими.
Напишем скрипт, который найдет все нерабочие ссылки и покажет их нам.
Для начала нам необходимо вытащить все внешние ссылки из базы данных:
В этой части скрипта мы просто вытаскиваем из базы все внешние ссылки. Проверим их:
Рассмотрим код подробнее (нумерация соответствует комментариям в коде):
Проверка заняла около 2 секунд. Запуская одновременно по 10 потоков производительность возрастает в 10 раз, по сравнению с обычными cURL запросами. Чтобы получить содержимое ответа сервера используйте функцию curl_multi_getcontent($ch), где $ch — дескриптор, полученный из curl_multi_info_read().
Другие возможности cURL в PHP HTTP аутентификацияЕсли HTTP запрос требует аутентификацию, используйте следующий код:
Загрузка по FTPВ PHP есть своя библиотека для работы с FTP, но можно использовать и cURL:
Использование проксиЗапросы можно выполнять через определенный proxy:
Колбэки (callback functions)Есть возможность использовать колбэки во время выполнения запроса, не дожидаясь его завершения. Например, во время того как ответ сервера загружается мы можем использовать уже полученные данные, не дожидаясь полной загрузки.
Колбэк функция должна возвращать длину строки для правильной работы запроса.
Каждый раз, когда будет получена очередная часть ответа сервера, будет вызван колбэк.
ЗаключениеВ этой статье мы рассмотрели продвинутые возможности cURL в PHP. В следующий раз, когда вам понадобится делать URL запросы — используйте cURL.
Мы предоставляем площадку для быстрого доступа к разнообразной информации. Подборки формируются без привязки к узким тематикам, чтобы читатель всегда находил что-то интересное или полезное для себя.
Краткие сводки по темам, вызывающим наибольший интерес среди пользователей.
Тексты на повседневные, бытовые, региональные и популярные темы.
Собранные по схожести темы статьи и материалы разного характера.
Доступ к ранее опубликованным материалам и тематическим блокам.
📍 г. Кемерово, ул. Полезная, д. 21, офис 410
☎ +7 (384) 445-09-33
📧 info@site.ru
🕓 Приём писем: ежедневно, 08:00 – 22:00
Контент, размещённый на сайте, поступает из общедоступных источников и обрабатывается автоматически. Администрация не участвует в создании и проверке опубликованных материалов.
При наличии претензий по поводу авторских прав, обратитесь к нам по контактному адресу — мы оперативно отреагируем на обоснованное обращение.
Сайт не зарегистрирован как СМИ и не несёт ответственности за точность информации.