CURL примеры 8 изумительных примеров 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_init — Инициализирует сеанс;
  • curl_close — Завершает сеанс;
  • curl_exec — Выполняет запрос;
  • curl_errno — Возвращает код ошибки;
  • curl_setopt — Устанавливает параметр для сеанса, например:
    • CURLOPT_HEADER – значение 1 означает, что необходимо вернуть заголовки;
    • CURLOPT_INFILESIZE — параметр для указания ожидаемого размера файла;
    • CURLOPT_VERBOSE — значение 1 означает что CURL будет выводить подробные сообщения о всех производимых операциях;
    • CURLOPT_NOPROGRESS – отключение индикатора прогресса операции, значение 1;
    • CURLOPT_NOBODY – если Вам не нужен документ, а нужны только заголовки, то поставьте значение 1;
    • CURLOPT_UPLOAD — для закачки файла на сервер;
    • CURLOPT_POST – выполнить запрос методом POST;
    • CURLOPT_FTPLISTONLY — получение списка файлов в директории FTP сервера, значение 1;
    • CURLOPT_PUT — выполнить запрос методом PUT, значение 1;
    • CURLOPT_RETURNTRANSFER — возвратить результат, не выводя в браузер, значение 1;
    • CURLOPT_TIMEOUT – максимальное время выполнения в секундах;
    • CURLOPT_URL – указание адреса для обращения;
    • CURLOPT_USERPWD — строка с именем пользователя и паролем в виде [username]:[password];
    • CURLOPT_POSTFIELDS – данные для POST запроса;
    • CURLOPT_REFERER — задает значение HTTP заголовка «Referer: »;
    • CURLOPT_USERAGENT — задает значение HTTP заголовка «User-Agent: »;
    • CURLOPT_COOKIE — содержимое заголовка «Cookie: », который будет отправлен с HTTP запросом;
    • CURLOPT_SSLCERT- имя файла с сертификатом в формате PEM;
    • CURLOPT_SSL_VERIFYPEER – значение 0, для того чтобы запретить проверку сертификата удаленного сервера (по умолчанию 1);
    • CURLOPT_SSLCERTPASSWD — пароль к файлу сертификата.
  • curl_getinfo — Возвращает информацию об операции, вторым параметром может выступать константа для указания, что именно нужно показать, например:
    • CURLINFO_EFFECTIVE_URL — последний использованный URL;
    • CURLINFO_HTTP_CODE — последний полученный код HTTP;
    • CURLINFO_FILETIME — дата модификации загруженного документа;
    • CURLINFO_TOTAL_TIME — время выполнения операции в секундах;
    • CURLINFO_NAMELOOKUP_TIME — время разрешения имени сервера в секундах;
    • CURLINFO_CONNECT_TIME — время, затраченное на установку соединения, в секундах;
    • CURLINFO_PRETRANSFER_TIME — время, прошедшее от начала операции до готовности к фактической передаче данных, в секундах;
    • CURLINFO_STARTTRANSFER_TIME — время, прошедшее от начала операции до момента передачи первого байта данных, в секундах;
    • CURLINFO_REDIRECT_TIME — время, затраченное на перенаправление, в секундах;
    • CURLINFO_SIZE_UPLOAD — количество байт при закачке;
    • CURLINFO_SIZE_DOWNLOAD — количество байт при загрузке;
    • CURLINFO_SPEED_DOWNLOAD — средняя скорость закачки;
    • CURLINFO_SPEED_UPLOAD — средняя скорость загрузки;
    • CURLINFO_HEADER_SIZE — суммарный размер всех полученных заголовков;
    • CURLINFO_REQUEST_SIZE — суммарный размер всех отправленных запросов;
    • CURLINFO_SSL_VERIFYRESULT — результат проверки SSL сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER;
    • CURLINFO_CONTENT_LENGTH_DOWNLOAD — размер загруженного документа, прочитанный из заголовка Content-Length;
    • CURLINFO_CONTENT_LENGTH_UPLOAD — размер закачиваемых данных;
    • CURLINFO_CONTENT_TYPE — содержимое полученного заголовка Content-type, или NULL в случае, когда этот заголовок не был получен.

Подробнее о функциях CURL и константах к ним можете посмотреть на официальном сайте PHP — php.net

На этом все, для начинающих я думаю достаточно Удачи!

Пример работы с cURL

В прошлых статьях мы с Вами познакомились с модулем cURL и ознакомились с областью его применения. И вот настало время приступить к его использованию уже в реальных PHP-скриптах. И в этой статье я Вам покажу пример работы с cURL в PHP.

Давайте реализуем простейшую задачу и считаем содержимое главной страницы MyRusakov.ru в переменную, а после выведем её на страницу:

Если Вы вдруг увидите ошибку: «Fatal error: Call to undefined function curl_init() in Z:\home\temp.local\www\index.php on line 2«, то значит Вы не установили модуль cURL. Поэтому сначала прочитайте статью установка cURL на Denwer.

А если никаких ошибок не возникнет, то после запуска этого скрипта Вы увидите содержимое главной страницы сайта MyRusakov.ru.

Всё начинается с curl_init(). Данная функция инициализирует сеанс cURL. С этой строки всё и начинается. Если по каким-либо причинам это не удаётся, то функция возвращает false, и мы уходим из блока IF. А если всё хорошо, и функция вернула true, то интерпритатор PHP заходит внутрь IF и начинаем выполнять следующие шаги.


Функция curl_setopt позволяет настраивать определённые опции cURL. Этих опций достаточно много, но задаются они все одинаково:

  • 1-й параметр. Идентификатор сеанса cURL.
  • 2-й параметр. Название опции cURL.
  • 3-й параметр. Значение опции cURL.

В примере выше мы задали для опции «CURLOPT_URL» значение «http://myrusakov.ru«. А опции «CURLOPT_RETURNTRANSFER» присвоили значение true. А теперь о том, что эти две опции означают:

  • Опция «CURLOPT_URL«. В этой опции задаётся тот URL, с которым мы будем работать в текущем сеансе cURL.
  • Опция «CURLOPT_RETURNTRANSFER«. Эта опция позволяет настроить тип вывода ответа от сервера: выводить сразу в браузер (значение false) или же возвращать ответ (значение true).

Следующим шагом является выполнение запроса cURL, и это делается с помощью функции curl_exec(), принимающей идентификатор сеанса cURL. Так как мы поставили опцию «CURLOPT_RETURNTRANSFER» в значение true, то ответ от сервера возвратится и сохранится в переменную $out, которую мы затем выводим.

И, наконец, последний шаг — это закрытие сеанса cURL, что делается с использованием функции curl_close(), принимающей тот же идентификатор cURL.

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

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 1 ):

    Для интереса решил поставить значение false для опции CURLOPT_RETURNTRANSFER, но ничего не изменилось. Пробовал на основе вашего сайта. Чем это вызвано и почему?

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    ez code

    Просто о сложном.

    Продвинутое использование cURL в PHP

    cURL — это инструмент, позволяющий взаимодействовать с различными серверами и поддерживающий множество протоколов: HTTP, FTP, TELNET и др. Изначально cURL — это служебная программа для командной строки. Но, к счастью для нас, PHP поддерживает работу с библиотекой cURL. В этой статье мы рассмотрим нетривиальные примеры работы с cURL.

    Почему cURL?

    На самом деле, есть много других способов отправить запрос на другой сервер чтобы, например, получить содержимое страницы. Многие, в основном из-за лени, используют простые PHP функции, вместо cURL:

    Однако они не позволяют эффективно обрабатывать ошибки. Также есть ряд задач, которые им вовсе не под силу — например, работа с cookies, авторизация, post запросы, загрузка файлов.

    cUrl — мощный инструмент, который поддерживает множество протоколов и предоставляет полную информацию о запросе.

    Основы cUrl

    Прежде чем перейти к сложным примерам, рассмотрим базовую структуру cURL запроса в PHP. Для выполнения cURL запроса в PHP необходимо сделать 4 основных шага:

    1. Инициализация.
    2. Установка опций.
    3. Выполнение запроса.
    4. Очистка ресурсов.

    В основном в этой статье мы будем рассматривать шаг №2, так как там происходит основная магия. Список cURL опций очень большой, поэтому все опции рассматривать сегодня мы не будем, а используем те, которые пригодятся для решения конкретных задач.

    Отслеживание ошибок

    При необходимости, вы можете добавить следующие строки для отслеживания ошибок:

    Обратите внимание, мы используем «===» вместо «==», т.к. надо отличать пустой ответ сервера от булевского значения FALSE, которое возвращается в случае ошибки.

    Получение информации о запросе

    Другой необязательный шаг — получение информации о 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»


    Отслеживание редиректов, в зависимости от браузера

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

    Мы будем использовать опцию 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

    Представьте себе блог с большим количеством постов, содержащих ссылки на внешние сайты. Некоторые из этих ссылок могут быть не рабочими.

    Напишем скрипт, который найдет все нерабочие ссылки и покажет их нам.

    Для начала нам необходимо вытащить все внешние ссылки из базы данных:

    В этой части скрипта мы просто вытаскиваем из базы все внешние ссылки. Проверим их:

    Рассмотрим код подробнее (нумерация соответствует комментариям в коде):

    1. Добавляем начальное количество дескрипторов, чтобы не перегружать систему потоками. Количество регулируется переменной $max_connections.
    2. В переменной $curRunning хранится количество работающих потоков, в $running — предыдущее значение, если они станут не равными, то один из потоков завершил работу.
    3. Получаем информацию о выполненном запросе.
    4. Если нет ответа сервера — ссылка не рабочая.
    5. Ответ сервера — 404.
    6. Иначе ссылка работает.
    7. Запрос выполнен, освобождаем ресурсы.
    8. Добавим новый урл к мульти дескриптору.
    9. Функция add_url_to_multi_handle() добавляет новый дескриптор с заданным урлом к мульти-дескриптору.

    Проверка заняла около 2 секунд. Запуская одновременно по 10 потоков производительность возрастает в 10 раз, по сравнению с обычными cURL запросами. Чтобы получить содержимое ответа сервера используйте функцию curl_multi_getcontent($ch), где $ch — дескриптор, полученный из curl_multi_info_read().

    Другие возможности cURL в PHP

    HTTP аутентификация

    Если HTTP запрос требует аутентификацию, используйте следующий код:

    Илон Маск рекомендует:  Dos fn 56h переименоватьпереместить файл

    Загрузка по FTP

    В PHP есть своя библиотека для работы с FTP, но можно использовать и cURL:

    Использование прокси

    Запросы можно выполнять через определенный proxy:

    Колбэки (callback functions)

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


    Колбэк функция должна возвращать длину строки для правильной работы запроса.

    Каждый раз, когда будет получена очередная часть ответа сервера, будет вызван колбэк.

    Заключение

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

    cURL — это просто

    Технология cURL

    cURL — это технология, которая предназначена для передачи/получения данных посредстов URL. Технология cURL поддерживает такие распространенные протоколы, как HTTP, FTP, HTTPs и другие. Изначально cURL был инструментом командной строки, однако разработчики PHP не поленились и создали библиотеку в PHP, чем облегчили жизнь миллионам программистам. Давайте попробуем вместе разобраться с технологией cURL на примерах. Советую читать всё и по порядку.

    Я знаю достаточно много примеров, где для получения сторонних web-страниц (парсеры) использовались совершенно другие способы, отличные от cURL. Например:

    • file_get_contents(«http://intop24.ru»);
    • file(«http://intop24.ru»);
    • readfile(«http://intop24.ru»);

    Почему разработчики использовали их и что в них не так? А потому, что не знали, либо не хотели знать, что такое cURL. А не так в них то, что функционал ограничен: получили страницу и все на этом, в то время, как cURL может отправить форму на странице, получить ответ, обработать ошибку, начать всё занова и т.д.

    Принцип работы cURL

    При использовании cURL-запросов существует 4 основных шага, которые должны (обязаны) быть в вашем скрипте, это:

    • Инициализация
    • Назначение параметров
    • Выполнение и выборка результата
    • Освобождение памяти

    Без любого из этих шагов ваш скрипт обречен на неудачу. Итак, основные шаги:

    Думаю что все шаги вам понятны за исключением второго: «Указания параметров». На этом шаге мы остановимся более подробно, т.к. именно он задает все необходимые настройки/параметры/методы.

    Ошибки в ходе работы скрипта

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

    Отмечу, что знак сравнения здесь ‘===’, а не ‘==’, т.е. сравнивается именно на наличие логического FALSE, а не пустой строки или строки ‘false’.

    Результат запроса

    Ну а после того, как CURL-запрос был выполнен, неплохо бы было знать, что он вернул:

    А вот какие еще даные мы можем получить:

    Индекс массива Значение Индекс массива Значение
    url string(17) «http://intop24.ru» content_type string(24) «text/html; charset=utf-8»
    http_code int(200) header_size int(218)
    request_size int(49) filetime int(-1)
    ssl_verify_result int(0) redirect_count int(0)
    total_time float(0.009419) namelookup_time float(1.3E-5)
    connect_time float(1.3E-5) pretransfer_time float(1.4E-5)
    size_upload float(0) size_download float(46523)
    speed_download float(4939271) speed_upload float(0)
    download_content_length float(-1) upload_content_length float(0)
    starttransfer_time float(0.009374) redirect_time float(0)
    certinfo array(0) redirect_url string(0) «»

    POST запрос с помощью CURL

    Давайте напишем наш первый скрипт, который отправит данные методом POST на какую-нибудь страницу и посмотрит, что отобразилось на этой странице.

    Сначала нам нужен файл, который бы принял наши данные и что-то вывел на страницу. Я расположил его по адресу http://intop24.ru/demo/curl/post.php. В нем содержится следующий код:

    Теперь попробуем передать туда какие-то данные:

    Результат можно посмотреть здесь: curl_post.php

    Отправка файла с помощью CURL

    Смысл здесь абсолютно такой же, как и в запросе POST.

    Файл, который примет данные: http://intop24.ru/demo/curl/upload_file.php.

    Теперь попробуем передать туда какие-то данные:

    Результат можно посмотреть здесь: curl_post_file.php

    Загрузка файла — это тот же самый POST-запрос, однако перед путем к файлу стоит знак «@», что и обозначает, что нужно это передать не как $_POST, а как $_FILES.

    HTTP аутентификация с помощью CURL

    Довольно полезная штука.

    Запрос сURL через прокси

    Понравилась или помогла статья? Самое лучшее, что ты можешь сделать — это поделиться ею в любой из своих соцсетей (даже если ты поделишься в твиттере или google+, которыми ты не пользуешься — это очень поможет развитию моего блога). Спасибо! А если ты еще и оставишь любой комментарий снизу в обсуждениях, то это будет двойное СПАСИБО!

    Приведите простой пример cURL

    04.06.2012, 16:54

    Php+Html!? как кнопке определить в событие по клику фун-цию php!? синтаксис любой пример приведите
    по клику на кнопке обычной а вообще мне надо стереть один файл просто по клику, вот сижу и думаю.

    Простой пример простого uploada
    Приведите Простой пример простого uploada

    Нужен простой пример чтения PDF
    дайте самый простой пример работы с файлом PDF на PHP


    Не работает простой пример работы с SQL в php
    Я новичок. Win 7, установлен Денвер, прочитал статью «Простой пример работы с базой данный в php.

    Трудности при написании чата. Покажите простой пример чата на 2 человека.
    Ребят, уже с ума сошел, но никак не сделаю нормальный чат в PHP. Я делаю так: есть textatea и куда.

    Урок 20. Работа с cURL в PHP

    В этой статье речь пойдет о таком мощном инструменте как cURL, а также о библиотеке для php, которая предоставляет доступ к этому инструменту — libcurl. Для чего все это нужно? Для связи с сервером по протоколам передачи данных, например, http или ftp. Остальные протоколы нам не особо интересны, если кто-то хочет углубляться в эту тему, то придется уже копать англоязычные ресурсы, а в этой статье будут основы и примеры использования.

    Что вообще такое cURL и libcurl? Общие моменты

    Итак, библиотека libcurl предоставляет нам возможность передачи данных на сервер, и получения ответов от него. Что нам это дает? Возможность эмуляции поведения пользователя или браузера! Вы можете получать содержимое страниц для последующего парсинга, можете получать заголовки ответов сервиса и программно авторизироваться на сайтах, делать скрипты постинга сообщений (например, в твиттер или на форумах) или грабберы информации. Все ограничивается лишь вашей фантазией!

    Установка cURL на Denwer (Денвер). Как начать пользоваться libcurl?

    Первое, что мы должны сделать, это установить библиотеку. На локальном компьютере я пользуюсь сборкой Denwer, как и подавляющее большинство начинающих вебмастеров, на которых и рассчитана статья. Опытные пользователи, которые самостоятельно устанавливают связку php+apache+mysql смогут установить и cURL, не мне объяснять им как это делается ;) А мы, новички, пользуемся готовыми решениями, чтобы было проще. Поэтому, устанавливаем libcurl следующим образом:

    • Скачиваем готовый пакет расширений «PHP5: дополнительные модули».
    • Соответственно, устанавливаем его. Ничего сложного, согласитесь :)
    • Открываем в блокноте (я всегда рекомендую Notepad++) файл:

    и убираем точку с запятой в начале сроки:

  • Делаем рестарт сервера Денвер.
  • Готово. Чтобы проверить работоспособность библиотеки можете вызвать функцию phpinfo() и найти там строчку: cURL support enabled. Поздравляю с первой победой.

    Описание cURL и первые шаги

    Для началом работы с инструментом, его нужно инициализировать. Делается это следующим образом:

    Мы использовали функцию инициализации сессии cURL. При этом, можно задать URL сразу, вот так:

    А можно сделать это потом, в опциях. Порядок установки опций не имеет значения. Делается это другой функцией:

    Первый параметр этой функции, то есть resource ch мы уже создали чуть выше, а вот параметров option и value очень много. Я думаю, что не стоит копипастить сюда их все, а достаточно лишь дать ссылку на подробное описание функции, надеюсь никто не обидится: curl_setopt.

    Приведу пример установки опций как раз на примере URL:

    Еще парочка примеров задания опций: давайте получим заголовок ответа сервера, при этом не будем получать саму страницу:

    Итак, мы инициализировали сессию, задали нужные нам параметры, теперь выполняем получившийся запрос, закрываем сессию и выводим результат:

    В итоге получаем наш первый полностью рабочий пример использования библиотеки libcurl:

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

    Великолепно! Мы получили заголовок ответа от сервера и опробовали библиотеку в действии. Чем это нам полезно? Тем, что теперь вы примерно представляете себе последовательность действий при работе с cURL:

    • Инициализировать сессию (curl_init)
    • Задать нужные нам опции (curl_setopt)
    • Выполнить полученный запрос (curl_exec)
    • Завершить сессию (curl_close)

    Двигаемся дальше, но перед тем как делать с libcurl что-то более серьезное, как я и обещал, разберем подробно из чего состоит заголовок HTTP запроса к серверу и ответ на него.

    Структура заголовка HTTP запроса

    Для примера я обратился к странице ya.ru и в Opera Dragonfly просмотрел сформированный запрос браузера и полученный от сервера ответ. Вот и они:
    Запрос
    GET / HTTP/1.1 — Пытаемся получить страницу по адресу /, то есть главную, находящуюся в корне папки. Используем протокол версии 1.1.
    User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14 — Представляемся серверу, мы — браузер Опера.
    Host: ya.ru — Доменное имя запрашиваемого ресурса.
    Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1 — Список допустимых форматов ресурса.
    Accept-Language: ru-RU,ru;q=0.9,en;q=0.8 — Список поддерживаемых языков.
    Accept-Encoding: gzip, deflate — Поддерживаемые способы кодирования.
    Cookie: yandexu > — Куки, при необходимости.
    Connection: Keep-Alive — Просим не разрывать соединение и оставаться на связи.
    Ответ
    HTTP/1.1 200 Ok — Получаем ответ с кодом 200, значит все ОК.
    Server: nginx — Сервер представился — это nginx.
    Date: Sun, 10 Mar 2013 14:10:50 GMT — Текущие дата и время на сервере.
    Content-Type: text/html; charset=UTF-8 — Тип контента и кодировка.
    Connection: close — Сервер не хочет поддерживать с нами постоянного соединения, поэтому сразу же его закрывает. Для следующего запроса будет установлено новое соединение.
    Cache-Control: no-cache,no-store,max-age=0,must-revalidate — Управление кэшированием. В данном случае оно отключено.
    Expires: Sun, 10 Mar 2013 14:10:50 GMT — Дата предполагаемого истечения срока действия сессии. В нашем случае оно совпадает с временем открытия, так как сервер тут же его закрыл, сразу после обработки.
    Last-Modified: Sun, 10 Mar 2013 14:10:50 GMT — Время последней модификации.
    Content-Encoding: gzip — Способ кодирования информации.
    Полный список всех параметров, которые можно встретить в заголовке HTTP запроса можно посмотреть на википедии.
    Теперь вы примерно представляете как общаются между собой ваш браузер и web-сервер. Это очень полезно знать и понимать, ведь мы будем пытаться эмулировать действия браузера с помощью библиотеки libcurl. Идем дальше.

    Пример работы с библиотекой

    Я считаю, что после того, как некоторые общие моменты уже ясны и вроде бы все понятно, то самое время переходить к практике и на примере уже оттачивать свое мастерство. Лично у меня всегда сразу руки чешутся все попробовать на практике :)

    Раз уж cURL так хорош для парсеров, то рассмотрим функцию получения кода страницы по ее адресу. При этом на выходе получим массив с заголовком, содержимым страницы и даже коды ошибок, если что-то пойдет не так.

    Входные параметры:
    url — адрес страницы или сайта.
    Значения выходных параметров (массив с тремя элементами):
    header[‘errno’] — если что-то пошло не так, то тут будет код ошибки.
    header[‘errmsg’] — здесь при этом будет текст ошибки.
    header[‘content’] — собственно сама страница\файл\картинка и т.д.

    Используем функцию, например, так:

    Все должно пройти без ошибок и вы получите код страницы в переменной $page . Если же попробовать получить несуществующую страницу yaaaaaaaaaaaa.ru , то получим ошибку:

    Все обрабатывается корректно и красиво :)
    Дальше с кодом страницы можно делать все что угодно, например, парсить регулярками. Но это все в следующих уроках, а пока что остановимся на этом.

    Комментарии:

    1. Tetsu — 03.05.2013 18:20

    Можете ли вы сообщить сколько еще уроков вы собираетесь сделать и на какие темы они будут?

    Tetsu, буду писать пока будет время :) Есть какие то пожелания?


    Tetsu — 04.05.2013 05:31

    Не совсем… просто хотелось бы освоить это дело побыстрее, поэтому и интересуюсь какие еще темы мне стоит изучить в продолжение этим.

    Alex — 09.08.2013 18:31

    А на MAC OS X нассали? У меня MAMP, что мне делать?

    Kostya — 09.09.2013 04:48

    Автор, спасибо огромное всё сразу стало на свои места в голове:)

    Valek — 11.11.2013 01:08

    Привет
    Забыл ты про функцию iconv у меня бяки отобразились
    Есть парочка тем если интересно.
    1)Чем отличаются echo от print(понимаю что тема затерта в нете но вот подробностей так и не встречал)
    Если хочешь я могу тебе написать массу огромную тем по которой не только мне интересно будет, но и публике тоже интересно будет!
    И еще вот что еще….Спасибо за урок очень хороший но очень сжат,мне кажется что новичку (совсем начинающему)будет трудновато понять что и как делается.

    Михаил — 21.11.2013 17:08

    Большое спасибо. Помог очень))

    Всем остальным, кто не дружит с регулярками, хочу посоветовать PHP Simple HTML DOM Parser.
    http://habrahabr.ru/post/176635/

    Виктория — 15.01.2014 00:11

    У меня, как и у Valek, вылезли кракозябры (с кодировкой проблемы). Valek написал про функцию
    string iconv ( string $in_charset , string $out_charset , string $str )
    но я никак не могу с ней разобраться. Как понять из какой кодировки в какую переделывать (первые два параметра), чтобы получился нормальный русский язык?

    myblaze — 15.01.2014 12:43

    проверьте, точно файл сохранен в кодировке UTF-8? В коде страницы присутствует meta-тег content=»text/html; charset=UTF-8″? И в заключении, после всего этого в самом браузере стоит автоопределение кодировки или жестко задана (может там, например, windows-1251)?

    Михаил — 19.01.2014 14:24

    Виктория, myblaze дело говорит. Ещё раз повторюсь, если позволите.
    1) Чтобы узнать кодировку html документа, нужно посмотреть в сам html документ и обратить внимание на тег
    2) Возможно вы пытаетесь вывести эту строку без учёта её кодировки. Советую сохранить в файл и просмотреть через файл эту строку. Возможно в файле всё откроется без кракозябр.
    3) Советую скачать текстовый редактор Notepad++. Там в меню есть возможность преобразовать и перекодировать. Поэкспериментируйте. Скопируйте и вставте свои кракозябры и попробуйте преобразовать или перекодировать. После каждой неудачной перекодировки нужно заново открывать файл. Это поможет быстрей разобраться с кодировками.

    Jack — 31.01.2014 21:26

    >>Alex — 09.08.2013 18:31
    А на MAC OS X нассали? У меня MAMP, что мне делать?
    —————-
    Для начала научится гуглить, у меня тоже мак c MAMP и проблемы найти мануал по подключению curl не составило труда.

    Jack, кто ищет, тот всегда найдет ;) А Aleх’у только удачи пожелать можно, может тоже когда-нибудь научится гуглить.

    Сергей — 03.10.2014 11:43

    М — 10.04.2015 12:44

    Денис — 24.01.2020 15:06

    Возникает проблема с Curl, когда сайт находится на сервере http выдается пустой лист, если смотрим смотри ошибки — culdnt connect to host, что делать?

    Dmitriy — 16.09.2020 19:39

    Fatal error: Call to undefined function curl_init()

    CURL примеры: 8 изумительных примеров cURL в PHP

    Мне нужно было разобраться, как именно работают функции curl_multi_*, представленные в PHP, почему так разнятся примеры не только в инете, но даже в справке PHP, что на самом деле происходит. CURL в PHP — это инкапсуляция настоящих функций библиотеки и еще некоторых других. При этом PHP использует не все функции libcurl, да и справка оставляет желать лучшего. Дабы не тыкать вслепую пимпы на клаве, перебирая варианты чужого кода, я решил постичь истинный смысл функций мульти-cURL и их параметров.

    API библиотеки libcurl на С

    По большей части здесь представлен перевод страниц сайта curl.haxx.se с моими соображениями в дополнение. Многие из приведенных здесь функций окажутся неизвестными для PHP-кодера. Cвязь двух языков рассмотрена ниже.

    Основная часть


    Пару слов о терминологии (без претензии на абсолютную правильность):

    • если вам неудобно слово «трансфер«, можете заменить на «передача«. Как угодно.
    • простой дескриптор («easy handle») — это то, что создается функцией curl_init(), т.е. дескриптор объекта cURL.
    • аббревиатура «cURL» и название «libcurl» в этой статье означают одно и тоже.
    • здесь речь пойдет в основном о мульти-интерфейсе библиотеки libcurl, если не указано иное. Т.е. статья про набор функций cURL для организации множества одновременных запросов к web-серверу. Что мне непонятно: говорим об интерфейсе, т.е. заготовках, «контракте» на наличие функций и их точное описание. А где собственно реализация этих функций, где конкретный код? Нужно учесть, что речь о использовании cURL на C, где, строго говоря, вообще нет интерфейсов. Может в таком случае можно приравнять понятие интерфейса к коду функций? Или я просто путаю понятия :)

    Простой интерфейс libcurl представляет собой синхронный интерфейс, который передает один файл за раз и не возвращает результат, пока не закончит. Мульти-интерфейс позволяет вашей программе передавать много файлов в обоих направлениях одновременно, не принуждая вас использовать много потоков. Из названия может показаться, что мульти-интерфейс предназначен для многопоточных приложений (игра слов английского языка — «multi interface» и «multi-threaded«), но на деле все почти наоборот. Мульти-интерфейс позволяет однопоточному приложению выполнять такие же виды множественных, одновременных трансферов, какие может выполнять многопоточная программа. Он позволяет получить выгоды многопоточных трансферов без сложностей управления и синхронизации многих потоков.

    Чтобы использовать этот интерфейс, вам лучше сначала понять, как пользоваться простым интерфейсом libcurl (здесь не рассказываю). Мульти-интерфейс это простой способ выполнить множество трасферов одновременно путем добавления простых дескрипторов в «мульти стек» (далее — «стек»).

    Примерный порядок работы такой: создать простые дескрипторы, описать все нужные для них опции (для каждого дескриптора могут быть свои опции). Далее создать мульти-дескриптор функцией curl_multi_init(), затем добавить в него простые дескрипторы вызовом curl_multi_add_handle(). Замечание: во избежание глюков простой дескриптор нельзя использовать, пока он находится в стеке. Когда добавлены все дескрипторы на текущий момент (можно добавить еще в любое время), запустить трансферы вызовом curl_multi_perform().

    CURLMcode curl_multi_perform (CURLM *multi_handle, int *running_handles)

    «perform» (англ). — выполнять. Функции curl_multi_init и curl_multi_add_handle нормально описаны в справке PHP. «Аналогом» curl_multi_perform() является curl_multi_exec.

    Тип CURLMcode — это тот же integer, только значения соответствуют кодам ошибок мульти-cURL. Коды ошибок cURL вместе с пояснениями (на английском).

    Функция curl_multi_perform() является ассинхронной. Она выполняется настолько мало, насколько это возможно, и возвращает контроль ваше программе. Она разработана так, чтобы никогда не блокировать (полагаю, речь о блокировании программы — прим. пер. ).

    Одна из основных идей мульти-интерфейса — позволить вашему приложению управлять ситуацией. Вы управляете трансферами вызывая curl_multi_perform(). После этого libcurl начнет передачу данных, если будет что передавать. Она будет использовать callback-функции и все, что вы указали в настойках простых дескрипторов (см. функцию curl_easy_setopt() или PHP-аналог curl_setopt()). Она будет передавать данные по всем тем трансферам в стеке, которые будут готовы передавать что-либо. Это может быть весь стек, а может ни одного трансфера.

    До версии 7.20.0: если в функция возвращает CURLM_CALL_MULTI_PERFORM, обычно это означает, что вам нужно вызвать curl_multi_perform() снова, до select() или других действий (об этом чуть позже). Не обязательно делать это немедленно, но этот код возврата означает, что у libcurl возможно есть еще данные для возврата или отправки перед тем, как она будет «удовлетворена».

    На заметку, функция curl_multi_perform() возращает CURLM_CALL_MULTI_PERFORM только когда хочет немедленно быть вызванной снова. Если все в порядке и нет ничего срочного, то функция возвращает CURLM_OK и вам нужно ждать активности, чтобы вызвать эту функцию снова.

    Как я не извращался, не смог получить другие CURLM_* коды, кроме CURLM_CALL_MULTI_PERFORM и CURLM_OK. Устойчивая система :)

    В своем втором параметре эта функция хранит количество еще работающих трансферов (а не флаг, как сказано в PHP-справке), т.е. тех, кто еще не закончил прием/передачу данных. Трансферы могут завершаться ошибкой передачи, это тоже вариант. Когда какой-то трансфер завершится, счетчик уменьшится. Когда он станет равен 0, значит все транферы завершились.

    Любопытный момент, который я обнаружил экспериментально: похоже, curl_multi_add_handle() кидает в стек копию простого дескриптора. К примеру, если закрыть дескриптор сразу после добавления, multi_curl_perform() все равно его запустит и обработает. Даже передача по ссылке, типа curl_multi_add_handle($mh, &$ch2), не меняет этот факт.

    Функцию curl_multi_info_read() можно использовать для получения информации по завершенным трансферам.

    CURLMsg *curl_multi_info_read ( CURLM *multi_handle, int *msgs_in_queue)

    Второй параметр указывает на число непросмотренных сообщений о завершенных трасферах. Т.о. если вызывать эту функцию в цикле, пока не закончатся сообщения (будет NULL), можно получить инфу по всем завершенным трансферам на данный момент.

    Если нужно остановить передачу по одному простому дескриптору в стеке, используйте curl_multi_remove_handle. После curl_multi_remove_handle() все еще можно использовать простой дескриптор для одиночных функций cURL, типа curl_exec() и т.п. Поэтому исключения дескриптора из стека не достаточно для корректного завершения работы. Нужно вызывать еще curl_easy_cleanup() для каждого дескриптора. После всей работы нужно закрыть мульти-дескриптор вызовом curl_multi_cleanup(). PHP-аналоги: curl_close и curl_multi_close.

    Высший пилотаж

    Сказанного выше уже достаточно, чтобы осознано использовать функции curl_multi_* в PHP. Однако, чтобы скрипт по минимуму использовал ресурсы сервера, а код выглядел более профессионально, нужно знать еще пару вещей.

    Небольшой экскурс в язык программирования C. int select (int nfds, fd_set *restrict readfds, fd_set *restrict writefds, fd_set *restrict errorfds, struct timeval *restrict timeout);

    Функция select() (или pselect()) — это ключевая функция для программ на C, обрабатывающих несколько файловых дескрипторов (или сокетов) одновременно. Массивы файловых дескрипторов называются наборами дескрипторов. Каждый набор объявлен как fd_set (структурный тип). Обычно select() используется для ожидания изменения статуса у одного или нескольких файловых дескрипторов. Изменение статуса происходит, когда в дескрипторе появляются данные для чтения, или когда во внутренних буферах ядра появляется место и в файловый дескриптор может быть произведена запись, или когда в дескрипторе происходит ошибка (в случае сокета или канала (pipe) такая ошибка возникает при закрытии другого участника соединения). Проще говоря, функция select() мониторит множество дескрипторов одновременно и своевременно погружает процесс в состояние сна при отсутствии активности. ( по материалам сайта amax.h16.ru) )

    Если ни один из заданных дескрипторов не готов к назначенным действиям, то select() блокирует скрипт, пока хотя бы один дескриптор не будет готов, или пока не наступит таймаут, или выполнение не прервется сигналом. Параметр timeout определяет, как долго функция select() должна ждать. Если время вышло, функция должна завершиться.

    int poll (struct pollfd fds[], nfds_t nfds, int timeout);

    Функция poll() определит файловые дескрипторы готовые для чтения/записи данных, или имеющие другие события. В последнем параметре функции устанавливается таймаут ожидания в миллисекундах. Если проверка сразу не выявила активности на выбранных файловых дескрипторах, poll() должна ждать активности на дескриторах, как минимум, указанный период времени. Если таймаут установлен 0, то poll() должна сразу закончить свою работу и вернуть значение; если -1, тогда приложение блокируется, пока не наступит требуемое событие или вызов функции не будет прерван.

    Теперь самое интересное. Ваше приложение может узнать у libcurl, когда библиотека готова к вызову для передачи данных. Поэтому не нужно дергать в цикле curl_multi_perform() до безумия. Функция curl_multi_fdset() предлагает интерфейс, которым вы можете извлекать наборы дескрипторов типа fd_set из libcurl, чтобы использовать вызовы select() или poll() для получения информации, когда трансферам в стеке возможно нужно внимание.

    CURLMcode curl_multi_fdset (CURLM *multi_handle, fd_set *read_fd_set, fd_set *write_fd_set, fd_set *exc_fd_set, int *max_fd)

    Очень важный момент здесь. Функция curl_multi_fdset() извлекает информацию о файловых дескрипторах из переданного ей мульти-дескриптора. Ее вызов заполнит набор fd_set конкретными файловыми дескриторами, используемыми интрефейсом libcurl в данный момент. Если в libcurl не задано ни одного файлового дескриптора, параметр функции max_fd будет содержать -1. Это значит, что libcurl делает что-то, что нельзя мониторить приложением через сокет. В этом случае вы не можете узнать, когда точно закончится текущее действие с использованием select(). Поэтому когда max_fd=-1, вам нужно немного подождать и затем вызвать curl_multi_perform() в любом случае. Сколько ждать? Я бы предложил 100 мс, как минимум, но вы можете сами найти наиболее подходящее значение.

    Как выглядит на практике описанное выше? Если libcurl в момент запроса по select() с установленным таймаутом вернет max_fd=-1, то программа зависнет на весь таймаут, не зависимо от дальнейшей активности файловых дескрипторов. Потом все заработает корректно. Т.е. указал таймаут 10 секунд, висим 10 секунд, потом работаем без задержек. Этот ньюанс может проявиться, если web-сервер стоит на медленной машине или при сильной загрузке нормального сервера. К примеру, у меня на локальной машине был косяк с зависанием, а на сервере хостера — нет.

    Большинство приложений использует curl_multi_fdset() для получения файловых дескрипторов из мульти-дескриптора libcurl. Затем приложение ждет каких-либо действий используя select(), и когда хотя бы один дескриптор готов, вызывает curl_multi_perform().

    Итак, вызываем curl_multi_fdset(), затем select(). Она вернет значение, когда один из файловых дескрипторов даст сигнал действия, и тогда вызываем curl_multi_perform(), чтобы позволить libcurl сделать то, что она хочет сделать. В этом суть контроля над ситуацией. А теперь ложка дегтя в эту кашу: примите во внимание, что у libcurl имеется своя возможность следить за таймаутом реакции, поэтому не следует назначать слишком длинное ожидание в select(), и нужно вызывать время от времени curl_multi_perform(), даже если не было сигналов от файловых дескрипторов (дословный перевод). Вот это миленько: какое точное понятие в программировании — «не слишком долго, время от времени». Замечу, что по умолчанию таймаут select() — 1сек, таймаут libcurl на ожидание реакции на сокетах

    5 мин (на форумах вычитал). Еще одно предостережение: обязательно вызвайте curl_multi_fdset() сразу перед вызовом select(), т.к. текущий набор файловых дескрипторов мог измениться с прошлого вызова функций libcurl.

    Лирическое отступление. Вопрос с правильным таймаутом оказался практически не разрешимым :( На том же сайте нашел следующее: «когда выполняете select(), вам следует использовать curl_multi_timeout() для выяснения нужного времени ожидания действия. Вызовите curl_multi_perform() даже если нет активности на указанных файловых дескрипторах по истечении таймаута«. Так вот, функция curl_multi_timeout() выясняет значение либо через вызов curl_multi_socket_action() задав второму параметру значение CURL_SOCKET_TIMEOUT, либо через вызов той же curl_multi_perform()! В пером случае без бутылки не разобраться, но все-таки можно докопаться до истины. Но каким образом вызов curl_multi_perform установит таймаут для select, я не понял :( Более того, покопавшись в исходниках PHP, я выяснил, что там таймаут расчитывается математикой от переданного параметра $timeout (double), затем задается в select(). Т.е. ни каких дополнительных вызовов curl_multi_* в PHP не делается.

    Вся прелесть в том, что описанные заморочки с curl_multi_fdset(), select() и иже с ними инкапсулированы в одну функцию PHP — curl_multi_select().

    Реализация на PHP

    Рассматриваем PHP 5.3.8, cURL 7.20.0. Ниже приведен список некоторых функций cURL в PHP и их связь с «настоящими» функциями библиотеки. В исходниках PHP помимо вызова «настоящих» функций libcurl есть еще обращения к zend_* и много того, что мне непостижимо. Но главную суть я уловил и подтвердил свои догадки. Что обо всем этом написано в справке PHP, можно узнать здесь.

    cURL на PHP Инкапсуляция (код С)
    int curl_multi_exec (resource $mh,
    int &$still_running)
    curl_multi_perform (mh->multi, &still_running)
    RETURN_LONG
    В текущей версии PHP не используется curl_multi_socket()
    int curl_multi_select ( resource $mh
    [, float $timeout = 1.0 ] )
    _make_timeval_struct (&to, timeout); расчет таймаута (внутренняя функция)
    curl_multi_fdset (mh->multi, &readfds, &writefds, &exceptfds, &maxfd);
    select (maxfd+1, &readfds, &writefds, &exceptfds, &to);
    RETURN_LONG
    void curl_multi_close (resource $mh) curl_multi_cleanup (mh->multi);
    bool curl_setopt (resource $ch,
    int $option, mixed $value)
    curl_easy_setopt (ch->cp, option, value);
    return 1;
    void curl_close (resource $ch) curl_easy_cleanup (ch->cp);
    Практика

    Теперь зная, откуда «ноги растут», можно создать правильный код на PHP. Приведенный мной пример не претендует на единственно возможный, это один из многих рабочих вариантов использования мульти-cURL. Весь код здесь не привожу, см. в этом архиве. Код в архиве немного другой, больше служебной информации выдает в браузер.

    Пример создан для демонстрации теоретического материала, изложенного выше. Он состоит из двух скриптов: test.php возвращает текущее время. Если ему передан в GET-запросе параметр p=NN, то перед ответом скрипт ждет NN секунд. Это эмуляция разного времени ответа от web-серверов в реальных запросах. Все для того, чтобы показать одновременную работу сURL со всеми заданными адресами. Второй скрипт архива, query.php — собственно сама программа с мульти-cURL.

    Если в строке 24 будет значение $sel = 1, значит найден один файловый дескриптор, готовый к передаче. Вполне может быть, что их будет несколько и значение будет больше. Если $sel = 0, значит таймаут истек, но нет ни одного готового дескриптора. Значение $running — количество еще активных простых дескрипторов cURL.

    В строке 25 стоит пауза. Это не «по учебнику», я придумал такую хитрость, чтобы дожидаться окончания одновременных запросов. Они обычно отстают друг от друга где-то на 0.5 секунды и такая пауза уменьшает количество итераций основного цикла. На практике она может оказаться бесполезной, можно смело ее убрать.

    Функцию curl_multi_info_read() засунул в цикл (строка 31), т.к. есть вероятность, что несколько дескрипторов закончатся одновременно (особенно с паузой выше), тогда их нужно обработать в одном шаге основного цикла.


    В примере я ставил таймаут select-а (строка 24) на несколько секунд только потому, что ответ предполагается ждать долго. На практике можно явно не указывать таймаут, тогда он будет равен 1сек. Все зависит от области применения. Одно могу сказать точно, curl_multi_select() нужен в коде. Он заметно разгружает скрипт и ресурсы сервера.

    Проблема этого примера в том, что приходится «ловить лису за хвост». Сервер хостера работает в разы шустрее, чем моя машина. Поэтому чтобы понять смысл кода, придется экспериментировать с таймаутом select-а, GET-запросом и паузой после curl_multi_select(). Если вам все это до лампочки, то на практике можно просто использовать код, как есть.

    [UPD] Прошло время, и сам не понял ход своих мыслей =) Строки 19-20. Сначала перечитываем «Очень важный момент», там два абзаца. Теперь поясняю: пауза нужна, чтобы пропустить переходное состояние libcurl между статусами *_PERFORM и *_OK, когда библиотека не вернет ни одного дескриптора и значит нечего разбирать в последующем цикле. Вот в чем была идея :) Кроме того, без этой паузы получим зависание на первом шаге цикла в строке 24, пока таймаут, заданный в *_select() не кончится. Все это наблюдалось на медленной машине. Теперь ОЗУ прибавилось, не получается подтвердить слова.

    Однако это не все странности :( Специально погонял этот код с отладочными var_dump(). Смотрите строки 17-20 (первый цикл и повторный вызов curl_multi_exec()). Знаете, что будет возвращать curl_multi_exec() на последних шагах цикла? CURLM_CALL_MULTI_PERFORM, затем FALSE (а не CURLM_OK, как ожидалось), что приводит к выходу из цикла. Далее вызов в 20-й строке вернет CURLM_OK, на быстрой машине даже пауза не нужна.

    А вот еще одна загадка: в строке 28 прописан тот же самый цикл опроса libcurl, что был в начале (с17). Но после него $status никогда не содержит FALSE, всегда только CURLM_OK! Ну и что, спрашивается, делает библиотека после запуска дескрипторов, раз не может сразу вернуть правильный статус при запуске процесса?

    Есть более короткий пример использования мульти-cURL, основанный на первой части статьи. Забьем на всякие ожидания и т.п. и получим следующее (источник + мои доработки):

    [1oo%, EoF]
    Похожие материалы: cURL — ключ от всех дверей
    Понравилась статья? Расскажите о ней друзьям:

    Урок по cURL: основы использования и пара полезных трюков (часть первая)

    Pirnazar

    Well-known member

    Для чего нужна cURL

    • cURL отлично подходит для имитации действий пользователя в браузере.

    Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. cURL позволяет автоматизировать всё это. Буквально несколькими командами cURL можно добиться авторизации и выполнения задания на роутере.

    • cURL удобен для получения данных с веб-сайтов в командной строке.

    Ещё один практический пример: мы хотим реализовать показ общей статистики для нескольких сайтов. Если использовать cURL, то это становится вполне тривиальной задачей: с помощью cURL мы проходим аутентификацию на сервисе сбора статистики (если это требуется), затем (опять же командами cURL) получаем необходимые страницы, парсим нужные нам данные; процедура повторяется для всех наших сайтов, затем мы складываем и выводим конечный результат.

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

    cURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое.

    cURL в PHP и командной строке

    Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке.

    Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскомментировать строку

    А затем перезагрузить сервер.

    На Linux необходимо установить пакет curl.

    На Debian, Ubuntu или Linux Mint:

    Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться.

    Получение данных при помощи cURL

    Получение данных при помощи cURL в PHP

    Всё очень просто:
    $target_url — адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).

    curl_init — инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch.

    Затем мы выполняем запрос cURL функцией curl_exec, которой в качестве параметра передаётся дискриптор.

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

    Чуть дополним наш скрипт:

    У нас появилась строчка curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);.

    curl_setopt — задаёт опции. Полный список опций можно найти на этой странице:

    Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.

    служат для отладки, на случай возникновения ошибок.

    Получение данных при помощи cURL в командной строке

    В командной строке достаточно набрать

    где вместо mi-al.ru — адрес вашего сайта.

    Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так:

    Чтобы они не выводились, добавляем ключ -s:

    Клиентская библиотека работы с URL

    User Contributed Notes 26 notes

    I wrote the following to see if a submitted URL has a valid http response code and also if it responds quickly.

    Use the code like this:

    = http_response ( $url ); // returns true only if http response code ?>

    The second argument is optional, and it allows you to check for a specific response code

    ( $url , ‘400’ ); // returns true if http status is 400
    ?>

    The third allows you to specify how long you are willing to wait for a response.


    ( $url , ‘200’ , 3 ); // returns true if the response takes less than 3 seconds and the response code is 200
    ?>

    function http_response ( $url , $status = null , $wait = 3 )
    <
    $time = microtime ( true );
    $expire = $time + $wait ;

    // we fork the process so we don’t have to wait for a timeout
    $pid = pcntl_fork ();
    if ( $pid == — 1 ) <
    die( ‘could not fork’ );
    > else if ( $pid ) <
    // we are the parent
    $ch = curl_init ();
    curl_setopt ( $ch , CURLOPT_URL , $url );
    curl_setopt ( $ch , CURLOPT_HEADER , TRUE );
    curl_setopt ( $ch , CURLOPT_NOBODY , TRUE ); // remove body
    curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , TRUE );
    $head = curl_exec ( $ch );
    $httpCode = curl_getinfo ( $ch , CURLINFO_HTTP_CODE );
    curl_close ( $ch );

    if( $status === null )
    <
    if( $httpCode 400 )
    <
    return TRUE ;
    >
    else
    <
    return FALSE ;
    >
    >
    elseif( $status == $httpCode )
    <
    return TRUE ;
    >

    return FALSE ;
    pcntl_wait ( $status ); //Protect against Zombie children
    > else <
    // we are the child
    while( microtime ( true ) $expire )
    <
    sleep ( 0.5 );
    >
    return FALSE ;
    >
    >
    ?>

    Hope this example helps. It is not 100% tested, so any feedback [sent directly to me by email] is appreciated.

    Hey I modified script for php 5. Also I add support server auth. and fixed some little bugs on the script.

    [EDIT BY danbrown AT php DOT net: Original was written by (unlcuky13 AT gmail DOT com) on 19-APR-09. The following note was included:
    Below is the my way of using through PHP 5 objecte oriented encapsulation to make thing easier.]

    class mycurl <
    protected $_useragent = ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1’ ;
    protected $_url ;
    protected $_followlocation ;
    protected $_timeout ;
    protected $_maxRedirects ;
    protected $_cookieFileLocation = ‘./cookie.txt’ ;
    protected $_post ;
    protected $_postFields ;
    protected $_referer = «http://www.google.com» ;

    protected $_session ;
    protected $_webpage ;
    protected $_includeHeader ;
    protected $_noBody ;
    protected $_status ;
    protected $_binaryTransfer ;
    public $authentication = 0 ;
    public $auth_name = » ;
    public $auth_pass = » ;

    public function useAuth ( $use ) <
    $this -> authentication = 0 ;
    if( $use == true ) $this -> authentication = 1 ;
    >

    public function setName ( $name ) <
    $this -> auth_name = $name ;
    >
    public function setPass ( $pass ) <
    $this -> auth_pass = $pass ;
    >

    public function __construct ( $url , $followlocation = true , $timeOut = 30 , $maxRedirecs = 4 , $binaryTransfer = false , $includeHeader = false , $noBody = false )
    <
    $this -> _url = $url ;
    $this -> _followlocation = $followlocation ;
    $this -> _timeout = $timeOut ;
    $this -> _maxRedirects = $maxRedirecs ;
    $this -> _noBody = $noBody ;
    $this -> _includeHeader = $includeHeader ;
    $this -> _binaryTransfer = $binaryTransfer ;

    $this -> _cookieFileLocation = dirname ( __FILE__ ). ‘/cookie.txt’ ;

    public function setReferer ( $referer ) <
    $this -> _referer = $referer ;
    >

    public function setCookiFileLocation ( $path )
    <
    $this -> _cookieFileLocation = $path ;
    >

    public function setPost ( $postFields )
    <
    $this -> _post = true ;
    $this -> _postFields = $postFields ;
    >

    public function setUserAgent ( $userAgent )
    <
    $this -> _useragent = $userAgent ;
    >

    public function createCurl ( $url = ‘nul’ )
    <
    if( $url != ‘nul’ ) <
    $this -> _url = $url ;
    >

    curl_setopt ( $s , CURLOPT_URL , $this -> _url );
    curl_setopt ( $s , CURLOPT_HTTPHEADER ,array( ‘Expect:’ ));
    curl_setopt ( $s , CURLOPT_TIMEOUT , $this -> _timeout );
    curl_setopt ( $s , CURLOPT_MAXREDIRS , $this -> _maxRedirects );
    curl_setopt ( $s , CURLOPT_RETURNTRANSFER , true );
    curl_setopt ( $s , CURLOPT_FOLLOWLOCATION , $this -> _followlocation );
    curl_setopt ( $s , CURLOPT_COOKIEJAR , $this -> _cookieFileLocation );
    curl_setopt ( $s , CURLOPT_COOKIEFILE , $this -> _cookieFileLocation );

    if( $this -> authentication == 1 ) <
    curl_setopt ( $s , CURLOPT_USERPWD , $this -> auth_name . ‘:’ . $this -> auth_pass );
    >
    if( $this -> _post )
    <
    curl_setopt ( $s , CURLOPT_POST , true );
    curl_setopt ( $s , CURLOPT_POSTFIELDS , $this -> _postFields );

    if( $this -> _includeHeader )
    <
    curl_setopt ( $s , CURLOPT_HEADER , true );
    >

    if( $this -> _noBody )
    <
    curl_setopt ( $s , CURLOPT_NOBODY , true );
    >
    /*
    if($this->_binary)
    <
    curl_setopt($s,CURLOPT_BINARYTRANSFER,true);
    >
    */
    curl_setopt ( $s , CURLOPT_USERAGENT , $this -> _useragent );
    curl_setopt ( $s , CURLOPT_REFERER , $this -> _referer );

    $this -> _webpage = curl_exec ( $s );
    $this -> _status = curl_getinfo ( $s , CURLINFO_HTTP_CODE );
    curl_close ( $s );

    public function getHttpStatus ()
    <
    return $this -> _status ;
    >

    public function __tostring () <
    return $this -> _webpage ;
    >
    >
    ?>

    [EDIT BY danbrown AT php DOT net: Contains a bugfix supplied by «roetsch.beni at googlemail (dot) com» on 02-AUG-09, with the following note: «Fixes the bugfix: 417 bug at lighthttp server.»]

    In this example: http://php.net/manual/en/book.curl.php#102885 by «frank at interactinet dot com»

    There’s a small bug in

    elseif( $status == $httpCode )
    <
    return TRUE ;
    >

    return FALSE ;
    pcntl_wait ( $status ); //Protect against Zombie children
    > else <
    // we are the child
    while( microtime ( true ) $expire )

    ?>

    The code will immediately leave the function at the `return`, and pcntl_wait() will NEVER be executed, under any circumstances.

    I can’t see any other issues with this function however.

    I needed to use cURL in a php script to download data using not only SSL for the server authentication but also for client authentication.
    On a default install of Fedora, setting up the proper cURL parameters, I would get an error:

    $ php curl.php
    Peer certificate cannot be authenticated with known CA certificates

    The data on http://curl.haxx.se/docs/sslcerts.html was most useful. Indeed, toward to bottom it tells you to add a missing link inside /etc/pki/nssdb to use the ca-bundle.crt file. You do it so:

    # cd /etc/pki/nssdb
    # ln -s /usr/lib64/libnssckbi.so libnssckbi.so

    Now you can do client authentication, provided you have your certificate handy with:

    = » [. ] » ;
    $tuCurl = curl_init ();
    curl_setopt ( $tuCurl , CURLOPT_URL , «https://example.com/path/for/soap/url/» );
    curl_setopt ( $tuCurl , CURLOPT_PORT , 443 );
    curl_setopt ( $tuCurl , CURLOPT_VERBOSE , 0 );
    curl_setopt ( $tuCurl , CURLOPT_HEADER , 0 );
    curl_setopt ( $tuCurl , CURLOPT_SSLVERSION , 3 );
    curl_setopt ( $tuCurl , CURLOPT_SSLCERT , getcwd () . «/client.pem» );
    curl_setopt ( $tuCurl , CURLOPT_SSLKEY , getcwd () . «/keyout.pem» );
    curl_setopt ( $tuCurl , CURLOPT_CAINFO , getcwd () . «/ca.pem» );
    curl_setopt ( $tuCurl , CURLOPT_POST , 1 );
    curl_setopt ( $tuCurl , CURLOPT_SSL_VERIFYPEER , 1 );
    curl_setopt ( $tuCurl , CURLOPT_RETURNTRANSFER , 1 );
    curl_setopt ( $tuCurl , CURLOPT_POSTFIELDS , $data );
    curl_setopt ( $tuCurl , CURLOPT_HTTPHEADER , array( «Content-Type: text/xml» , «SOAPAction: \»/soap/action/query\»» , «Content-length: » . strlen ( $data )));

    $tuData = curl_exec ( $tuCurl );
    if(! curl_errno ( $tuCurl )) <
    $info = curl_getinfo ( $tuCurl );
    echo ‘Took ‘ . $info [ ‘total_time’ ] . ‘ seconds to send a request to ‘ . $info [ ‘url’ ];
    > else <
    echo ‘Curl error: ‘ . curl_error ( $tuCurl );
    >

    curl_close ( $tuCurl );
    echo $tuData ;
    ?>

    CURL failed with PHP5.3 and Apache2.2.X on my Windows 7 machine.

    It turns out that it’s not enough to copy the two dll’s mentioned (libeay32 and sslea32) from the php folder into your system32 folder. You HAVE TO UNBLOCK THESE TWO FILES.

    Right click the file, select unblock, for each one. Then restart Apache.

    Another very handy security feature added into Windows.

    Here you have a function that I use to get the content of a URL using cURL:

    function getUrlContent($url) <
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)’);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);
    $data = curl_exec($ch);
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    curl_close($ch);
    return ($httpcode>=200 && $httpcode


    You can use this class for fast entry

    class cURL <
    var $headers ;
    var $user_agent ;
    var $compression ;
    var $cookie_file ;
    var $proxy ;
    function cURL ( $cookies = TRUE , $cookie = ‘cookies.txt’ , $compression = ‘gzip’ , $proxy = » ) <
    $this -> headers [] = ‘Accept: image/gif, image/x-bitmap, image/jpeg, image/pjpeg’ ;
    $this -> headers [] = ‘Connection: Keep-Alive’ ;
    $this -> headers [] = ‘Content-type: application/x-www-form-urlencoded;charset=UTF-8’ ;
    $this -> user_agent = ‘Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)’ ;
    $this -> compression = $compression ;
    $this -> proxy = $proxy ;
    $this -> cookies = $cookies ;
    if ( $this -> cookies == TRUE ) $this -> cookie ( $cookie );
    >
    function cookie ( $cookie_file ) <
    if ( file_exists ( $cookie_file )) <
    $this -> cookie_file = $cookie_file ;
    > else <
    fopen ( $cookie_file , ‘w’ ) or $this -> error ( ‘The cookie file could not be opened. Make sure this directory has the correct permissions’ );
    $this -> cookie_file = $cookie_file ;
    fclose ( $this -> cookie_file );
    >
    >
    function get ( $url ) <
    $process = curl_init ( $url );
    curl_setopt ( $process , CURLOPT_HTTPHEADER , $this -> headers );
    curl_setopt ( $process , CURLOPT_HEADER , 0 );
    curl_setopt ( $process , CURLOPT_USERAGENT , $this -> user_agent );
    if ( $this -> cookies == TRUE ) curl_setopt ( $process , CURLOPT_COOKIEFILE , $this -> cookie_file );
    if ( $this -> cookies == TRUE ) curl_setopt ( $process , CURLOPT_COOKIEJAR , $this -> cookie_file );
    curl_setopt ( $process , CURLOPT_ENCODING , $this -> compression );
    curl_setopt ( $process , CURLOPT_TIMEOUT , 30 );
    if ( $this -> proxy ) curl_setopt ( $process , CURLOPT_PROXY , $this -> proxy );
    curl_setopt ( $process , CURLOPT_RETURNTRANSFER , 1 );
    curl_setopt ( $process , CURLOPT_FOLLOWLOCATION , 1 );
    $return = curl_exec ( $process );
    curl_close ( $process );
    return $return ;
    >
    function post ( $url , $data ) <
    $process = curl_init ( $url );
    curl_setopt ( $process , CURLOPT_HTTPHEADER , $this -> headers );
    curl_setopt ( $process , CURLOPT_HEADER , 1 );
    curl_setopt ( $process , CURLOPT_USERAGENT , $this -> user_agent );
    if ( $this -> cookies == TRUE ) curl_setopt ( $process , CURLOPT_COOKIEFILE , $this -> cookie_file );
    if ( $this -> cookies == TRUE ) curl_setopt ( $process , CURLOPT_COOKIEJAR , $this -> cookie_file );
    curl_setopt ( $process , CURLOPT_ENCODING , $this -> compression );
    curl_setopt ( $process , CURLOPT_TIMEOUT , 30 );
    if ( $this -> proxy ) curl_setopt ( $process , CURLOPT_PROXY , $this -> proxy );
    curl_setopt ( $process , CURLOPT_POSTFIELDS , $data );
    curl_setopt ( $process , CURLOPT_RETURNTRANSFER , 1 );
    curl_setopt ( $process , CURLOPT_FOLLOWLOCATION , 1 );
    curl_setopt ( $process , CURLOPT_POST , 1 );
    $return = curl_exec ( $process );
    curl_close ( $process );
    return $return ;
    >
    function error ( $error ) <
    echo «

    » ;
    die;
    >
    >
    $cc = new cURL ();
    $cc -> get ( ‘http://www.example.com’ );
    $cc -> post ( ‘http://www.example.com’ , ‘foo=bar’ );
    ?>

    [EDIT BY danbrown AT php DOT net: Includes a bugfix provided by «Anonymous» on 01-Dec-2008 @ 06:52. Also replaced real URL with example.com as per RFC 2606.]

    [EDIT BY danbrown AT php DOT net: Includes a bugfix provided by (manuel AT rankone DOT ch) on 24-NOV-09 to properly reference cURL initialization.]

    Команда curl. Синтаксис. Примеры использования

    Сurl – утилита командной строки для скачивания и загрузки данных. Она выросла из проекта шведского программиста Даниэля Стенберга. Изначально в середине 90-х, на заре развития Интернета, он разрабатывал бота, который должен был загружать с веб-страницы курсы валют и сообщать пользователям IRC эквивалент шведских крон в долларах США. Со временем проект развивался, появлялась поддержка различных протоколов и новые функции. Теперь curl используется для передачи любых данных и ряда других полезных задач. Рассмотрим основные моменты работы с этим инструментом.

    Синтаксис и опции curl

    Синтаксис команды следующий:

    В качестве аргумента задается, как правило, URL скачиваемого файла. Основные опции перечислены ниже

    -# — отображать простой прогресс-бар во время загрузки;
    -0 — использовать протокол http 1.0;
    -1 — использовать протокол шифрования tlsv1;
    -2 — использовать sslv2;
    -3 — использовать sslv3;
    -4 — использовать ipv4;
    -6 — использовать ipv6;
    -A — указать свой USER_AGENT;
    -b — сохранить Cookie в файл;
    -c — отправить Cookie на сервер из файла;
    -C — продолжить загрузку файла с места разрыва или указанного смещения;
    -m — максимальное время ожидания ответа от сервера;
    -d — отправить данные методом POST;
    -D — сохранить заголовки, возвращенные сервером в файл;
    -e — задать поле Referer-uri, указывает с какого сайта пришел пользователь;
    -E — использовать внешний сертификат SSL;
    -f — не выводить сообщения об ошибках;
    -F — отправить данные в виде формы;
    -G — если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
    -H — передать заголовки на сервер;
    -I — получать только HTTP заголовок, а все содержимое страницы игнорировать;
    -j — прочитать и отправить cookie из файла;
    -J — удалить заголовок из запроса;
    -L — принимать и обрабатывать перенаправления;
    -s — максимальное количество перенаправлений с помощью Location;
    -o — выводить контент страницы в файл;
    -O — сохранять контент в файл с именем страницы или файла на сервере;
    -p — использовать прокси;
    —proto — указать протокол, который нужно использовать;
    -R — сохранять время последнего изменения удаленного файла;
    -s — выводить минимум информации об ошибках;
    -S — выводить сообщения об ошибках;
    -T — загрузить файл на сервер;
    -v — максимально подробный вывод;
    -y — минимальная скорость загрузки;
    -Y — максимальная скорость загрузки;
    -z — скачать файл, только если он был модифицирован позже указанного времени;
    -V — вывести версию.

    Основные опции мы рассмотрим на простых примерах.

    Просмотр версии curl

    Опция -V или —version выводит не только версию curl, но и краткую информацию о поддерживаемых протоколах и функциях:

    Скачивание файла

    Если вам требуется скачать файл, запустите curl с опцией –O или –o. Первая из них сохраняет файл в текущей рабочей директории под тем же именем, что и в удаленном месторасположении. Вторая опция позволяет вам указать другое имя и/или место для скачивания.

    Cохранение файла под исходным именем (yourfile) в текущей рабочей директории.

    Cохранение файла под именем newfile в директории /tmp/examplе/.

    Возобновление прерванной загрузки

    Если скачивание по какой-то причине было прервано (например, пользователь нажал Ctrl+C), вы легко можете возобновить его с момента остановки при помощи опции -C – (дефис, С, тире):

    Скачивание нескольких файлов

    Следующая команда позволит вам скачать info.html с http://yoursite.com и about.html c http://mysite.com в один прием:

    Если использовать curl вместе с командой xargs, можно скачивать файлы в соответствии со списком URL, заданном в файле (в данном примере listurls.txt):

    Использование прокси-сервера

    Если вы подключены через прокси-сервер, нужно указать его команде curl при помощи следующих опций (в данном примере имя сервера proxy.yourdomain.com, порт 8080, имя пользователя user, пароль qwerty1234):

    Если ваш прокси-сервер не требует аутентификации, опцию -U user:qwerty1234 указывать не нужно.

    Запрос HTTP-заголовков

    HTTP-заголовки позволяют удаленному веб-серверу помимо ответа на сам запрос отправлять дополнительную информацию. Она предоставляет клиенту данные о том, как обрабатывать ответ:

    Для запроса HTTP-заголовков веб-сайта выполните команду с опцией -I:

    $ curl -I https://itproffi.ru

    Также эту информацию можно получить, воспользовавшись функциями браузера для разработчиков.

    cURL POST-запросы с параметрами

    Следующая команда отправит на https://yourdomain.com/info.php параметры firstName и lastName с соответствующими значениями:

    Этим приемом можно пользоваться для симуляции работы обычных веб-форм.

    Следующая команда скачивает в текущую рабочую директорию файл yourfile с удаленного FTP-сервера ftp://yourftpserver (имя пользователя user, пароль qwerty1234):

    Если FTP-сервер поддерживает анонимный вход, параметр –u с именем пользователя и пароля указывать не нужно.

    Загрузка файлов на FTP-сервер

    Для загрузки локального файла mylocalfile.tar.gz воспользуйтесь следующей командой:

    Указание агента пользователя

    Агент пользователя – часть информации HTTP-запроса. Она показывает, каким браузером пользуется клиент. Можно посмотреть, что имеющаяся версия curl передает по умолчанию и установить новое значение:

    Хотите посмотреть, какие файлы cookie скачиваются на ваш компьютер, когда вы заходите на определенный сайт? Опция —cookie-jar сохраняет их список в файл, который в дальнейшем можно просмотреть при помощи команды cat.

    Полученные в предыдущем примере файлы cookie можно использовать в дальнейших запросах к тому же самому сайту:

    Изменение разрешения имен

    Если вы веб-разработчик и хотите протестировать локальную версию сайта, прежде чем загружать его на сервер, при помощи опции —resolve можно указать curl выполнять разрешение имени вашего сайта на адрес локального узла, например:

    Таким образом, при запросе на http://www.yourdomain.com curl будет запрашивать сайт с локального узла, а не использовать DNS или файл /etc/hosts.

    Ограничение скорости скачивания

    Чтобы curl не занимал всю пропускную способность канала, можно ограничить скорость скачивания при помощи опции —limit-rate:

    Заключение

    Мы рассмотрели краткую историю появления curl и наиболее характерные примеры применения этой команды. Для более подробной информации можно обратиться к соответствующей man-странице.

    Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL