• Curl параметры командной строки. Оттачиваем мастерство работы с cURL

    08.05.2023

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

    Для решения таких задач и задач подобного круга можно воспользоваться утилитой curl. Она позволяет решить намного более широкий круг задач, среди которых даже имитация действий пользователя на сайте. В этой статье мы рассмотрим как пользоваться curl, что это такое и зачем нужна эта программа.

    На самом деле, curl - это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами.

    Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl - это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье.

    Команда curl

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

    $ curl опции ссылка

    Теперь рассмотрим основные опции:

    • -# - отображать простой прогресс-бар во время загрузки;
    • -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 linux, но здесь перечислено все основное, что вам придется использовать.

    Как пользоваться curl?

    Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

    Самая частая задача - это . Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:

    curl https://raw.githubusercontent.com/curl/curl/master/README.md

    Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:

    curl -o readme.txt https://raw.githubusercontent.com/curl/curl/master/README.md

    А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

    curl -O https://raw.githubusercontent.com/curl/curl/master/README.md

    curl -# -C - -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

    Если нужно, одной командой можно скачать несколько файлов:

    curl -O https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

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

    curl -z 21-Dec-17 https://raw.githubusercontent.com/curl/curl/master/README.md -O https://raw.githubusercontent.com/curl/curl/master/README

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

    Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

    curl --limit-rate 50K -O https://cdn.kernel.org/pub/linux/kernel/v4.x/testing/linux-4.11-rc7.tar.xz

    Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

    curl -Y 100 -O https://raw.githubusercontent.com/curl/curl/master/README.md

    Передача файлов

    curl -T login.txt ftp://speedtest.tele2.net/upload/

    Или проверим отправку файла по HTTP, для этого существует специальный сервис:

    curl -T ~/login.txt http://posttestserver.com/post.php

    В ответе утилита сообщит где вы можете найти загруженный файл.

    Отправка данных POST

    Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

    curl -d "field1=val&fileld2=val1"http://posttestserver.com/post.php

    Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

    curl -F "password=@pass;type=text/plain" http://posttestserver.com/post.php

    Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

    Передача и прием куки

    Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

    curl -c cookie.txt http://posttestserver.com/post.php

    Затем можно отправить cookie curl обратно:

    curl -b cookie.txt http://posttestserver.com/post.php

    Передача и анализ заголовков

    Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

    curl -I https://сайт

    А опция -H позволяет или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:

    Аутентификация curl

    Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:

    curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt

    Точно так же будет выполняться аутентификация на серверах HTTP.

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

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

    curl -x proxysever.test.com:3128 http://google.co.in

    Выводы

    В этой статье мы рассмотрели как пользоваться curl, зачем нужна эта утилита и основные ее возможности. Несмотря на свою схожесть с , они очень сильно отличаются. Команда curl linux предназначена больше для анализа и имитации различных действий на сервере, тогда как wget больше подходит для загрузки файлов и краулинга сайтов.

    Предлагаю немного поговорить о языке программирования 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, т.е. раскомментировать следующую строку

    Библиотека не подключена

    ;extension=php_curl.dll

    Библиотека подключена

    Extension=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

    Заголовок 1"; break; case 2: echo "<Н2>Заголовок 2"; break; case 3: echo "<Н3>Заголовок 3"; break; } } ?>

    В итоге если вы запустите 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 — строка с именем пользователя и паролем в виде :;
      • 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 4 >= 4.0.2, PHP 5, PHP 7)

    curl_setopt — Устанавливает параметр для сеанса CURL

    Список параметров

    Дескриптор cURL, полученный из curl_init() .

    Устанавливаемый параметр CURLOPT_XXX .

    Значение параметра option .

    bool :

    Параметр Замечания
    CURLOPT_AUTOREFERER TRUE для автоматической установки поля Referer: в запросах, перенаправленных заголовком Location: .
    CURLOPT_BINARYTRANSFER TRUE для возврата необработанного ответа при использовании константы CURLOPT_RETURNTRANSFER . С PHP 5.1.3 эта опция больше не требуется: необработанный вывод всегда возвращается при использовании опции CURLOPT_RETURNTRANSFER .
    CURLOPT_COOKIESESSION TRUE для указания текущему сеансу начать новую "сессию" cookies. Это заставит libcurl проигнорировать все "сессионные" cookies, которые она должна была бы загрузить, полученные из предыдущей сессии. По умолчанию, libcurl всегда сохраняет и загружает все cookies, вне зависимости от того, являются ли они "сессионными" или нет. "Сессионные" cookies - это cookies без срока истечения, которые должны существовать только для текущей "сессии".
    CURLOPT_CERTINFO TRUE для вывода информации о сертификате SSL в поток STDERR при безопасных соединениях. Добавлена в cURL 7.19.1. Доступна, начиная с версии PHP 5.3.2. Для корректной работы требует включенной опции CURLOPT_VERBOSE .
    CURLOPT_CONNECT_ONLY TRUE сообщает библиотеке, чтобы она провела необходимые аутентификацию прокси и настройку соединения, но не передавала данные. Эта опция реализована для HTTP, SMTP и POP3. Добавлена в 7.15.2. Доступна с версии PHP 5.5.0.
    CURLOPT_CRLF TRUE для преобразования концов строк Unix в CRLF.
    CURLOPT_DNS_USE_GLOBAL_CACHE TRUE для использования глобального кэша DNS. Этот параметр не является потокобезопасным и по умолчанию включен.
    CURLOPT_FAILONERROR TRUE для подробного отчета при неудаче, если полученный HTTP-код больше или равен 400. Поведение по умолчанию возвращает страницу как обычно, игнорируя код.
    CURLOPT_FILETIME TRUE для попытки получения даты модификации удаленного документа. Это значение может быть получено с помощью параметра CURLINFO_FILETIME из функции curl_getinfo() .
    CURLOPT_FOLLOWLOCATION TRUE для следования любому заголовку "Location: " , отправленному сервером в своем ответе (учтите, что это происходит рекурсивно, PHP будет следовать за всеми посылаемыми заголовками "Location: " , за исключением случая, когда установлена константа CURLOPT_MAXREDIRS ).
    CURLOPT_FORBID_REUSE TRUE для принудительного закрытия соединения после завершения его обработки так, чтобы его нельзя было использовать повторно.
    CURLOPT_FRESH_CONNECT TRUE для принудительного использования нового соединения вместо закэшированного.
    CURLOPT_FTP_USE_EPRT TRUE для использования EPRT (и LPRT) при активных FTP загрузках. Используйте FALSE для того, чтобы отключить EPRT и LPRT и использовать только PORT.
    CURLOPT_FTP_USE_EPSV TRUE для первоначальной пробы команды EPSV при FTP передачах. Если команда не удалась, будет произведен обратный откат к PASV. Установите в FALSE для отключения EPSV.
    CURLOPT_FTP_CREATE_MISSING_DIRS TRUE для создания отсутствующих директорий, если FTP-операция обнаруживает несуществующий путь.
    CURLOPT_FTPAPPEND TRUE для записи удаленного файла в конец, вместо перезаписывания его поверх существующего файла.
    CURLOPT_TCP_NODELAY Задает на постоянной основе должна ли опция TCP_NODELAY установлена или очищена (1 = установлена, 0 = очищена). По умолчанию опция очищается. Доступна с версии PHP 5.2.1 для версий собранных с libcurl 7.11.2 или новее.
    CURLOPT_FTPASCII Псевдоним CURLOPT_TRANSFERTEXT . Используйте его вместо этого.
    CURLOPT_FTPLISTONLY TRUE для возврата только списка имен из FTP директории.
    CURLOPT_HEADER TRUE для включения заголовков в вывод.
    CURLINFO_HEADER_OUT TRUE для отслеживания строки запроса дескриптора. Доступен, начиная с версии PHP 5.1.3. Префикс CURLINFO_ употреблен специально.
    CURLOPT_HTTPGET TRUE для сброса метода HTTP-запроса в метод GET. Так как GET используется по умолчанию, этот параметр необходим только в случае, если метод запроса был ранее изменен.
    CURLOPT_HTTPPROXYTUNNEL TRUE для туннелирования через указанный HTTP-прокси.
    CURLOPT_MUTE TRUE для полного отключения сообщений функций cURL. Удалена в cURL 7.15.5 (Можно использовать опцию CURLOPT_RETURNTRANSFER)
    CURLOPT_NETRC TRUE для считывания файла ~/.netrc на предмет логина и пароля для удаленного сайта, с которым устанавливается соединение.
    CURLOPT_NOBODY TRUE для исключения тела ответа из вывода. Метод запроса устанавливается в HEAD. Смена этого параметра в FALSE не меняет его обратно в GET.
    CURLOPT_NOPROGRESS

    TRUE для отмены индикатора прогресса при передачах cURL.

    Замечание :

    PHP автоматически устанавливает этот параметр в TRUE , меняйте его только для отладочных целей.

    CURLOPT_NOSIGNAL TRUE для игнорирования любой функции cURL, посылающей сигналы PHP процессу. Этот параметр включен по умолчанию в многопоточных SAPIs для корректной работы таймаут параметров.
    CURLOPT_POST TRUE для использования обычного HTTP POST. Данный метод POST использует обычный , обычно используемый в HTML-формах.
    CURLOPT_PUT TRUE для загрузки файла методом HTTP PUT. Используемый файл должен быть установлен с помощью параметров CURLOPT_INFILE и CURLOPT_INFILESIZE .
    CURLOPT_RETURNTRANSFER TRUE для возврата результата передачи в качестве строки из curl_exec() вместо прямого вывода в браузер.
    CURLOPT_SAFE_UPLOAD TRUE для отключения поддержки префикса @ для загружаемых файлов в CURLOPT_POSTFIELDS , который означает, что значения, переданные с @ могут безопасно передаваться в виде полей. Вместо префикса можно использовать опцию CURLFile d. Добавлена в PHP 5.5.0 со значением по умолчанию FALSE . В PHP 5.6.0 стала по умолчанию равна TRUE .
    CURLOPT_SSL_VERIFYPEER FALSE для остановки cURL от проверки сертификата узла сети. Альтернативные сверяемые сертификаты могут быть указаны с помощью параметра CURLOPT_CAINFO или директории с сертификатами, указываемой параметром CURLOPT_CAPATH . По умолчанию равно TRUE начиная с версии cURL 7.10. Дистрибутив по умолчанию устанавливается начиная с версии cURL 7.10.
    CURLOPT_TRANSFERTEXT TRUE для использования ASCII режима при FTP передачах. При использовании LDAP данные возвращаются простым текстом вместо HTML. В Windows системах поток STDOUT не устанавливается в бинарный режим.
    CURLOPT_UNRESTRICTED_AUTH TRUE для продолжения посылки логина и пароля при редиректах (при использовании CURLOPT_FOLLOWLOCATION ), даже при изменении имени хоста.
    CURLOPT_UPLOAD TRUE для подготовки к загрузке файла на сервер.
    CURLOPT_VERBOSE TRUE для вывода дополнительной информации. Записывает вывод в поток STDERR , или файл, указанный параметром CURLOPT_STDERR .

    Для следующих значений параметра option , параметр value должен быть типа integer :

    Параметр Устанавливаемое значение value Замечания
    CURLOPT_BUFFERSIZE Размер буфера, используемого при каждом чтении. Однако, нет никакой гарантии что данный запрос будет завершен. Добавлен в версии cURL 7.10.
    CURLOPT_CLOSEPOLICY Одна из констант CURLCLOSEPOLICY_* .

    Замечание :

    Эта опция устарела, так как никогда не была реализована в cURL и не работала.

    Удалена в PHP 5.6.0.
    CURLOPT_CONNECTTIMEOUT Количество секунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания.
    CURLOPT_CONNECTTIMEOUT_MS Количество миллисекунд ожидания при попытке соединения. Используйте 0 для бесконечного ожидания. Если библиотека libcurl скомпилирована с использованием стандартного системного преобразователя имен, то соединение будет по-прежнему использовать полносекундное ожидание в качестве тайм-аута с минимально допустимым тайм-аутом в 1 секунду. Добавлен в версии cURL 7.16.2. Доступно, начиная с версии PHP 5.2.3.
    CURLOPT_DNS_CACHE_TIMEOUT Количество секунд, в течение которых в памяти хранятся DNS-записи. По умолчанию этот параметр равен 120 (2 минуты).
    CURLOPT_FTPSSLAUTH Метод FTP аутентификации (в активном режиме): CURLFTPAUTH_SSL (сначала проверяется SSL), CURLFTPAUTH_TLS (сначала проверяется TLS) или CURLFTPAUTH_DEFAULT (cURL решает сама). Добавлен в версии cURL 7.12.2.
    CURLOPT_HTTP_VERSION CURL_HTTP_VERSION_NONE (по умолчанию, CURL сама выбирает используемую версию), CURL_HTTP_VERSION_1_0 (принудительное использование HTTP/1.0), or CURL_HTTP_VERSION_1_1 (принудительное использование HTTP/1.1).
    CURLOPT_HTTPAUTH

    Можно использовать побитовый оператор | (или) для комбинации нескольких методов вместе. В этом случае cURL опросит сервер на предмет поддерживаемых методов авторизации и выберет лучший из них.

    CURLAUTH_ANY - это псевдоним CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .

    CURLAUTH_ANYSAFE - это псевдоним CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .

    CURLOPT_INFILESIZE Ожидаемый размер файла, в байтах, при загрузке файла на удаленный сервер. Учтите, что использование этой опции не остановит дальнейшую посылку данных, превышающих это значение, так как посылаемые данные зависят от результата CURLOPT_READFUNCTION .
    CURLOPT_LOW_SPEED_LIMIT Верхний порог скорости передачи данных, в байтах в секунду. Проверка происходит в течение CURLOPT_LOW_SPEED_TIME секунд, после чего PHP считает передачу слишком медленной и прерывает ее.
    CURLOPT_LOW_SPEED_TIME Максимальное количество секунд, в течение которых скорость передачи не должна превышать CURLOPT_LOW_SPEED_LIMIT , иначе PHP пометит передачу как слишком медленную и прекратит ее.
    CURLOPT_MAXCONNECTS Максимальное количество постоянных соединений. При достижении лимита для определения закрываемого соединения используется параметр CURLOPT_CLOSEPOLICY .
    CURLOPT_MAXREDIRS Максимальное количество принимаемых редиректов. Используйте этот параметр вместе с параметром CURLOPT_FOLLOWLOCATION .
    CURLOPT_PORT Альтернативный порт соединения.
    CURLOPT_POSTREDIR Битовая маска, содержащая 1 (301 Moved Permanently), 2 (302 Found) и 4 (303 See Other), чтобы задавать должен ли метод HTTP POST обрабатываться при включенной опции CURLOPT_FOLLOWLOCATION , если произошел указанный тип перенаправления. Добавлено в cURL 7.19.1. Доступно с PHP 5.3.2.
    CURLOPT_PROTOCOLS

    Битовая маска из значений CURLPROTO_* . Данная маска ограничивает используемые libcurl протоколы. Это позволяет иметь libcurl, работающую с большим количеством протоколов, и ограничивать работу определенных передач только для некоторого их набора. По умолчанию, libcurl использует все поддерживаемые протоколы. Смотрите также параметр CURLOPT_REDIR_PROTOCOLS .

    Корректные значения протоколов: CURLPROTO_HTTP , CURLPROTO_HTTPS , CURLPROTO_FTP , CURLPROTO_FTPS , CURLPROTO_SCP , CURLPROTO_SFTP , CURLPROTO_TELNET , CURLPROTO_LDAP , CURLPROTO_LDAPS , CURLPROTO_DICT , CURLPROTO_FILE , CURLPROTO_TFTP , CURLPROTO_ALL

    CURLOPT_PROXYAUTH Методы авторизации HTTP, используемые при соединении с прокси-сервером. Используйте те же самые битовые маски, которые были описаны у параметра CURLOPT_HTTPAUTH . В данный момент для авторизации прокси поддерживаются только CURLAUTH_BASIC и CURLAUTH_NTLM . Добавлен в версии cURL 7.10.7.
    CURLOPT_PROXYPORT Номер порта прокси-сервера, к которому осуществляется соединение. Этот номер также может быть установлен с помощью параметра CURLOPT_PROXY .
    CURLOPT_PROXYTYPE Либо CURLPROXY_HTTP (по умолчанию), либо CURLPROXY_SOCKS5 . Добавлен в версии cURL 7.10.
    CURLOPT_REDIR_PROTOCOLS Битовая маска из значений CURLPROTO_* . Данная битовая масска ограничивает протоколы используемые libcurl при редиректе (при включенном параметре CURLOPT_FOLLOWLOCATION ). Это позволяет ограничить набор используемых протоколов при редиректах для некоторых передач. По умолчанию, libcurl поддерживает все протоколы, кроме FILE и SCP. В версиях, предшествовавших 7.19.4, перенаправление использовалось для всех протоколов без исключения. Смотрите также описание параметра CURLOPT_PROTOCOLS для списка констант со значениями протоколов. Добавлен в версии cURL 7.19.4.
    CURLOPT_RESUME_FROM Смещение начала передачи, в байтах.
    CURLOPT_SSL_VERIFYHOST Используйте 1 для проверки существования общего имени в сертификате SSL. Используйте 2 для проверки существования общего имени и также его совпадения с указанным хостом. В боевом окружении значение этого параметра должно быть 2 (установлено по умолчанию). Поддержка значения 1 убрана в cURL 7.28.1
    CURLOPT_SSLVERSION Одна из констант CURL_SSLVERSION_DEFAULT (0), CURL_SSLVERSION_TLSv1 (1), CURL_SSLVERSION_SSLv2 (2), CURL_SSLVERSION_SSLv3 (3), CURL_SSLVERSION_TLSv1_0 (4), CURL_SSLVERSION_TLSv1_1 (5) или CURL_SSLVERSION_TLSv1_2 (6).
    CURLOPT_TIMECONDITION Способ трактовки параметра CURLOPT_TIMEVALUE . Используйте CURL_TIMECOND_IFMODSINCE для возвращения страницы, только если она была изменена со времени, указанного в параметре CURLOPT_TIMEVALUE . Если страница не была изменена, вернется заголовок "304 Not Modified" , подразумевая, что параметр CURLOPT_HEADER установлен в TRUE . Используйте CURL_TIMECOND_IFUNMODSINCE для обратного эффекта. По умолчанию используется CURL_TIMECOND_IFMODSINCE .
    CURLOPT_TIMEOUT Максимально позволенное количество секунд для выполнения cURL-функций.
    CURLOPT_TIMEOUT_MS Максимально позволенное количество миллисекунд для выполнения cURL-функций. Если libcurl собрана с использованием обычного системного распознавателя имен, то этот промежуток соединения все еще будет использовать секундное округление таймаутов, с минимально разрешенным таймаутом в одну секунду. Добавлен в версии cURL 7.16.2. Доступен, начиная с версии PHP 5.2.3.
    CURLOPT_TIMEVALUE Количество секунд, начиная с 1 января 1970 года. Это время будет использовано параметром CURLOPT_TIMECONDITION . По умолчанию, используется параметр CURL_TIMECOND_IFMODSINCE .
    CURLOPT_MAX_RECV_SPEED_LARGE Если скорость скачки превысит это значение (указанное в байтах в секунду) в среднем в течение всей передачи, то скачка будет приостановлена для поддержания средней скорости меньше либо равной данному параметру. По умолчанию скорость не ограничивается.
    CURLOPT_MAX_SEND_SPEED_LARGE Если загрузка на сервер превысит это значение (указанное в байтах в секунду) в среднем в течение всей передачи, то загрузка будет приостановлена для поддержания средней скорости меньше либо равной данному параметру. По умолчанию скорость не ограничивается. Добавлен в версии cURL 7.15.5. Доступен, начиная с версии PHP 5.4.0.
    CURLOPT_SSH_AUTH_TYPES Битовая маска, состоящая из одной или более констант: CURLSSH_AUTH_PUBLICKEY , CURLSSH_AUTH_PASSWORD , CURLSSH_AUTH_HOST , CURLSSH_AUTH_KEYBOARD . Установите CURLSSH_AUTH_ANY для того, чтобы libcurl выбрал одну из них самостоятельно. Добавлено в cURL 7.16.1.
    CURLOPT_IPRESOLVE Позволяет приложению выбрать вид IP адреса, с которым определяется имя хоста. Это необходимо, если используется имя хоста, которое получается с использованием более одной версии IP адреса. Возможными значениями могут быть CURL_IPRESOLVE_WHATEVER , CURL_IPRESOLVE_V4 , CURL_IPRESOLVE_V6 , и по умолчанию CURL_IPRESOLVE_WHATEVER . Добавлено в cURL 7.10.8.

    Для следующих значений параметра option , параметр value должен быть типа string :

    Параметр Устанавливаемое значение value Замечания
    CURLOPT_CAINFO Имя файла, содержащего один или более сертификатов, с которыми будут сверяться узлы. Этот параметр имеет смысл только при использовании совместно с CURLOPT_SSL_VERIFYPEER . Требует абсолютный путь.
    CURLOPT_CAPATH Директория, содержащая несколько CA сертификатов. Используйте этот параметр совместно с CURLOPT_SSL_VERIFYPEER .
    CURLOPT_COOKIE Содержимое заголовка "Cookie: " , используемого в HTTP-запросе. Обратите внимание, что несколько cookies разделяются точкой с запятой с последующим пробелом (например, "fruit=apple; colour=red ")
    CURLOPT_COOKIEFILE Имя файла, содержащего cookies. Данный файл должен быть в формате Netscape или просто заголовками HTTP, записанными в файл. Если в качестве имени файла передана пустая строка, то cookies сохраняться не будут, но их обработка все еще будет включена.
    CURLOPT_COOKIEJAR Имя файла, в котором будут сохранены все внутренние cookies текущей передачи после закрытия дескриптора, например, после вызова curl_close.
    CURLOPT_CUSTOMREQUEST

    Собственный метод запроса, используемый вместо "GET" или "HEAD" при выполнении HTTP-запроса. Это полезно при запросах "DELETE" или других, более редких HTTP-запросах. Корректными значениями будут слова наподобие "GET" , "POST" , "CONNECT" и так далее; т.е. не вводите здесь всю строку с HTTP-запросом. Например, указание "GET /index.html HTTP/1.0\r\n\r\n" будет неправильным.

    Замечание :

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

    CURLOPT_EGDSOCKET Наподобие CURLOPT_RANDOM_FILE , за исключением того, что имя файла устанавливается в сокет Entropy Gathering Daemon.
    CURLOPT_ENCODING Содержимое заголовка "Accept-Encoding: " . Это позволяет декодировать запрос. Поддерживаемыми кодировками являются "identity" , "deflate" и "gzip" . Если передана пустая строка, "" , посылается заголовок, содержащий все поддерживаемые типы кодировок. Добавлен в версии cURL 7.10.
    CURLOPT_FTPPORT Значение, которое будет использоваться для определения IP-адреса для команды "PORT" FTP-протокола. Команда "PORT" сообщает серверу, с каким IP-адресом он должен устанавливать соединение. Это может быть IP-адрес, имя хоста, имя сетевого интерфейса (под Unix), или просто "-" для использования системного IP-адреса по умолчанию.
    CURLOPT_INTERFACE Имя используемого сетевого интерфейса. Может быть именем интерфейса, IP адресом или именем хоста.
    CURLOPT_KEYPASSWD Пароль, который требуется для использования приватного ключа CURLOPT_SSLKEY или CURLOPT_SSH_PRIVATE_KEYFILE . Добавлено в cURL 7.16.1.
    CURLOPT_KRB4LEVEL Уровень безопасности KRB4 (Kerberos 4). Любое из следующих значений (в порядке от слабого к самому сильному) корректно: "clear" , "safe" , "confidential" , "private". . Если указанная строка отличается от данных значений, будет использовано значение "private" . Установка этого параметра в NULL полностью отключит безопасность KRB4. На данный момент безопасность KRB4 работает только с FTP транзакциями.
    CURLOPT_POSTFIELDS Все данные, передаваемые в HTTP POST-запросе. Для передачи файла, укажите перед именем файла @ , а также используйте полный путь к файлу. Тип файла также может быть указан с помощью формата ";type=mimetype ", следующим за именем файла. Этот параметр может быть передан как в качестве url-закодированной строки, наподобие "para1=val1¶2=val2&... ", так и в виде массива, ключами которого будут имена полей, а значениями - их содержимое. Если value является массивом, заголовок Content-Type будет установлен в значение multipart/form-data . Начиная с версии PHP 5.2.0, при передаче файлов с префиксом @ , value должен быть массивом. С версии PHP 5.5.0, префикс @ устарел и файлы можно отправлять с помощью CURLFile . Префикс @ можно отключить, чтобы можно было передавать значения, начинающиеся с @ , задав опцию CURLOPT_SAFE_UPLOAD в значение TRUE .
    CURLOPT_PROXY HTTP-прокси, через который будут направляться запросы.
    CURLOPT_PROXYUSERPWD Логин и пароль, записанные в виде ":" , используемые при соединении через прокси.
    CURLOPT_RANDOM_FILE Имя файла, используемого для инициализации генератора случайных чисел для SSL.
    CURLOPT_RANGE Диапазон данных, которые нужно загрузить, в формате "X-Y" , причем либо X, либо Y могут быть опущены. Протокол HTTP также поддерживает передачу нескольких диапазонов, разделенных запятыми, они задаются в формате "X-Y,N-M" .
    CURLOPT_REFERER Содержимое заголовка "Referer: " , который будет использован в HTTP-запросе.
    CURLOPT_SSH_HOST_PUBLIC_KEY_MD5 Строка, содержащая 32 шестнадцатеричных цифры. Строка должна являться контрольной суммой по алгоритму MD5 публичного ключа удаленного компьютера и libcurl будет сбрасывать соединение к удаленному хосту до тех пор, пока контрольная сумма не будет соответствовать публичному ключу. Эта опция предназначена только для передачи данных с помощью SCP и SFTP. Добавлено в cURL 7.17.1.
    CURLOPT_SSH_PUBLIC_KEYFILE Имя файла для вашего публичного ключа. Если не задано, то libcurl использует по умолчанию файл $HOME/.ssh/id_dsa.pub, если переменная окружения HOME установлена и файл "id_dsa.pub" в текущей директории, если переменная HOME не установлена. Добавлено в cURL 7.16.1.
    CURLOPT_SSH_PRIVATE_KEYFILE Имя файла для вашего приватного ключа. Если не задано, то libcurl использует по умолчанию файл $HOME/.ssh/id_dsa, если переменная окружения HOME установлена и файл "id_dsa" в текущей директории, если переменная HOME не установлена. Если файл защищен паролем, установите пароль с помощью CURLOPT_KEYPASSWD . Добавлено в cURL 7.16.1.
    CURLOPT_SSL_CIPHER_LIST Список шифров, используемый в SSL-передачах. Например, RC4-SHA и TLSv1 являются корректными списками шифров.
    CURLOPT_SSLCERT Имя файла с корректно отформатированным PEM-сертификатом.
    CURLOPT_SSLCERTPASSWD Пароль, необходимый для использования сертификата CURLOPT_SSLCERT .
    CURLOPT_SSLCERTTYPE Формат сертификата. Поддерживаются форматы "PEM" (по умолчанию), "DER" и "ENG" . Добавлен в версии cURL 7.9.3.
    CURLOPT_SSLENGINE Идентификатор механизма шифрования для закрытого ключа SSL, указанного в параметре CURLOPT_SSLKEY .
    CURLOPT_SSLENGINE_DEFAULT Идентификатор механизма шифрования, используемого для ассиметричных операций шифрования.
    CURLOPT_SSLKEY Имя файла с закрытым ключом SSL.
    CURLOPT_SSLKEYPASSWD

    Тайный пароль, необходимый для использования закрытого ключа SSL, указанного параметром CURLOPT_SSLKEY .

    Замечание :

    Так как этот параметр содержит ценный пароль, помните, что данный PHP-скрипт нужно хранить в безопасном месте.

    CURLOPT_SSLKEYTYPE Тип закрытого ключа SSL, указанного в параметре CURLOPT_SSLKEY . Поддерживаются следующие типы ключей: "PEM" (по умолчанию), "DER" и "ENG" .
    CURLOPT_URL Загружаемый URL. Данный параметр может быть также установлен при инициализации сеанса с помощью curl_init() .
    CURLOPT_USERAGENT Содержимое заголовка "User-Agent: " , посылаемого в HTTP-запросе.
    CURLOPT_USERPWD Логин и пароль, используемые при соединении, указанные в формате ":" .

    Для следующих значений параметра option , параметр value должен быть массивом:

    Параметр Устанавливаемое значение value Замечания
    CURLOPT_HTTP200ALIASES Массив HTTP 200 ответов, которые будут трактоваться корректными ответами, а не ошибочными. Добавлен в версии cURL 7.10.3.
    CURLOPT_HTTPHEADER Массив устанавливаемых HTTP-заголовков, в формате array("Content-type: text/plain", "Content-length: 100")
    CURLOPT_POSTQUOTE Массив FTP-команд, выполняемых на сервере, после выполнения FTP-запроса.
    CURLOPT_QUOTE Массив FTP-команд, выполняемых на сервере, перед выполнением FTP-запроса.

    Для следующих значений параметра option , параметр value должен быть потоковым дескриптором (возвращаемым, например, функцией fopen() ):

    Параметр Устанавливаемое значение value
    CURLOPT_FILE Файл, в который будет записан результат передачи. По умолчанию используется поток вывода STDOUT (окно браузера).
    CURLOPT_INFILE Файл, из которого должно идти чтение данных, при загрузке на сервер.
    CURLOPT_STDERR Альтернативное файл для вывода ошибок, используемый вместо потока ошибок STDERR .
    CURLOPT_WRITEHEADER Файл, в который будут записаны заголовки текущей операции.

    Для следующих значений параметра option , параметр value должен быть правильным именем функции или замыканием:

    Параметр Устанавливаемое значение value
    CURLOPT_HEADERFUNCTION Callback-функция принимает два параметра. Первым параметром является дескриптор cURL, вторым параметром является строка с записываемыми заголовками. Заголовки должны быть записаны с помощью данной callback-функции. Должна возвратить количество записанных байт.
    CURLOPT_PASSWDFUNCTION Callback-функция принимает три параметра. Первым параметром является дескриптор cURL, вторым параметром является строка с запросом пароля, третьим параметром является максимальная длина пароля. Должна возвратить строку, содержащую пароль.
    CURLOPT_PROGRESSFUNCTION

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

    Замечание :

    Callback-функция вызывается только, если опция CURLOPT_NOPROGRESS установлена в значение FALSE .

    Можно вернуть ненулевое значение, чтобы отменить передачу. В этом случае будет выставлена ошибка CURLE_ABORTED_BY_CALLBACK .

    CURLOPT_READFUNCTION Callback-функция принимает три параметра. Первым параметром является дескриптор cURL, вторым параметром является ресурс потока, переданный cURL через опцию CURLOPT_INFILE , а третьим параметром является максимально разрешенное количество данных для чтения. Callback-функция должна возвратить строку, с длиной не превышающей запрошенного количества данных, обычно с помощью чтения из переданного потокового ресурса. Должна возвратить пустую строку для сигнала о конце файла EOF .
    CURLOPT_WRITEFUNCTION Callback-функция принимает два параметра. Первым параметром является дескриптор cURL, а вторым параметром является строка с записываемыми данными. Данные должны быть сохранены с помощью данной функции. Она должна возвратить точное количество записанных байт, иначе закачка будет прервана с ошибкой.

    Другие значения:

    Возвращаемые значения

    Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.

    Список изменений

    Версия Описание
    5.6.0 Опция CURL_SAFE_UPLOAD теперь имеет значение по умолчанию равное TRUE .
    5.6.0 Удалена опция CURLOPT_CLOSEPOLICY и связанные с ней значения.
    5.5.0 Ресурс cURL добавлен первым аргументом в callback-функцию CURLOPT_PROGRESSFUNCTION .
    5.5.0 Добавлена опция CURLOPT_SHARE .
    5.3.0 Добавлена опция CURLOPT_PROGRESSFUNCTION .
    5.2.10 Добавлены параметры CURLOPT_PROTOCOLS и CURLOPT_REDIR_PROTOCOLS .
    5.1.0 Добавлены параметры CURLOPT_AUTOREFERER , CURLOPT_BINARYTRANSFER , CURLOPT_FTPSSLAUTH , CURLOPT_PROXYAUTH и CURLOPT_TIMECONDITION .
    5.0.0 Добавлены параметры CURLOPT_FTP_USE_EPRT , CURLOPT_NOSIGNAL , CURLOPT_UNRESTRICTED_AUTH , CURLOPT_BUFFERSIZE , CURLOPT_HTTPAUTH , CURLOPT_PROXYPORT , CURLOPT_PROXYTYPE , CURLOPT_SSLCERTTYPE и CURLOPT_HTTP200ALIASES .

    Примеры

    Пример #1 Инициализация сеанса CURL и загрузка web-страницы

    // создание нового ресурса cURL
    $ch = curl_init ();

    /* http://localhost/upload.php:
    print_r($_POST);
    print_r($_FILES);
    */

    $ch = curl_init ();

    $data = array("name" => "Foo" , "file" => "@/home/user/test.png" );

    Curl_setopt ($ch , CURLOPT_URL , "http://localhost/upload.php" );
    curl_setopt ($ch , CURLOPT_POST , 1 );
    curl_setopt ($ch , CURLOPT_POSTFIELDS , $data );

    Curl_exec ($ch );
    ?>

    Результат выполнения данного примера:

    Array ( => Foo) Array ( => Array ( => test.png => image/png => /tmp/phpcpjNeQ => 0 => 279))

    Примечания

    Замечание :

    Передача массива в CURLOPT_POSTFIELDS закодирует данные в виде multipart/form-data , тогда как передача URL-кодированной строки закодирует данные в виде application/x-www-form-urlencoded .

    cURL - это специальный инструмент, который предназначен для того, чтобы передавать файлы и данные синтаксисом URL. Данная технология поддерживает множество протоколов, таких как HTTP, FTP, TELNET и многие другие. Изначально cURL было разработано для того, чтобы быть инструментом командной строки. К счастью для нас, библиотека cURL поддерживается языком программирования PHP. В этой статье мы рассмотрим некоторые расширенные функций cURL, а также затронем практическое применение полученных знаний средствами PHP.

    Почему cURL?

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

    $content = file_get_contents("http://www.nettuts.com"); // или $lines = file("http://www.nettuts.com"); // или readfile("http://www.nettuts.com");

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

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

    Базовая структура

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

    // 1. инициализация $ch = curl_init(); // 2. указываем параметры, включая url curl_setopt($ch, CURLOPT_URL, "http://www.nettuts.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); // 3. получаем HTML в качестве результата $output = curl_exec($ch); // 4. закрываем соединение curl_close($ch);

    Шаг #2 (то есть, вызов curl_setopt()) будем обсуждать в этой статье намного больше, чем все другие этапы, т.к. на этой стадии происходит всё самое интересное и полезное, что вам необходимо знать. В cURL существует огромное количество различных опций, которые должны быть указаны, для того чтобы иметь возможность сконфигурировать URL-запрос самым тщательным образом. Мы не будем рассматривать весь список целиком, а остановимся только на том, что я посчитаю нужным и полезным для этого урока. Всё остальное вы сможете изучить сами, если эта тема вас заинтересует.

    Проверка Ошибки

    Вдобавок, вы также можете использовать условные операторы для проверки выполнения операции на успех:

    // ... $output = curl_exec($ch); if ($output === FALSE) { echo "cURL Error: " . curl_error($ch); } // ...

    Тут прошу отметить для себя очень важный момент: мы должны использовать “=== false” для сравнения, вместо “== false”. Для тех, кто не в курсе, это поможет нам отличать пустой результат от булевого значения false, которое и будет указывать на ошибку.

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

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

    // ... curl_exec($ch); $info = curl_getinfo($ch); echo "Took " . $info["total_time"] . " seconds for url " . $info["url"]; // …

    Возвращаемый массив содержит следующую информацию:

    • “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”

    Обнаружение перенаправления в зависимости от браузера

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

    Мы собираемся использовать опцию CURLOPT_HTTPHEADER для того, чтобы определить наши исходящие HTTP заголовки, включая название браузера пользователя и доступные языки. В конечном итоге мы сможем определить, какие сайты перенаправляют нас к разным URL.

    // тестируем URL $urls = array("http://www.cnn.com", "http://www.mozilla.com", "http://www.facebook.com"); // тестируем браузеры $browsers = array("standard" => array ("user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)", "language" => "en-us,en;q=0.5"), "iphone" => array ("user_agent" => "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3", "language" => "en"), "french" => array ("user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)", "language" => "fr,fr-FR;q=0.5")); foreach ($urls as $url) { echo "URL: $url\n"; foreach ($browsers as $test_name => $browser) { $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url); // указываем заголовки для браузера curl_setopt($ch, CURLOPT_HTTPHEADER, array("User-Agent: {$browser["user_agent"]}", "Accept-Language: {$browser["language"]}")); // нам не нужно содержание страницы curl_setopt($ch, CURLOPT_NOBODY, 1); // нам необходимо получить HTTP заголовки curl_setopt($ch, CURLOPT_HEADER, 1); // возвращаем результаты вместо вывода curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); $output = curl_exec($ch); curl_close($ch); // был ли HTTP редирект? if (preg_match("!Location: (.*)!", $output, $matches)) { echo "$test_name: redirects to $matches\n"; } else { echo "$test_name: no redirection\n"; } } echo "\n\n"; }

    Сначала мы указываем список URL сайтов, которые будем проверять. Точнее, нам понадобятся адреса данных сайтов. Далее нам необходимо определить настройки браузера, чтобы протестировать каждый из этих URL. После этого мы воспользуемся циклом, в котором пробежимся по всем полученным результатам.

    Приём, который мы используем в этом примере для того, чтобы задать настройки cURL, позволит нам получить не содержание страницы, а только HTTP-заголовки (сохраненные в $output). Далее, воспользовавшись простым regex, мы можем определить, присутствовала ли строка “Location:” в полученных заголовках.

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

    Создание POST запроса на определённый URL

    При формировании GET запроса передаваемые данные могут быть переданы на URL через “строку запроса”. Например, когда Вы делаете поиск в Google, критерий поиска располагаются в адресной строке нового URL:

    Http://www.google.com/search?q=ruseller

    Для того чтобы сымитировать данный запрос, вам не нужно пользоваться средствами cURL. Если лень вас одолевает окончательно, воспользуйтесь функцией “file_get_contents()”, для того чтобы получить результат.

    Но дело в том, что некоторые HTML-формы отправляют POST запросы. Данные этих форм транспортируются через тело HTTP запроса, а не как в предыдущем случае. Например, если вы заполнили форму на форуме и нажали на кнопку поиска, то скорее всего будет совершён POST запрос:

    Http://codeigniter.com/forums/do_search/

    Мы можем написать PHP скрипт, который может сымитировать этот вид URL запроса. Сначала давайте создадим простой файл для принятия и отображения POST данных. Назовём его post_output.php:

    Print_r($_POST);

    Затем мы создаем PHP скрипт, чтобы выполнить cURL запрос:

    $url = "http://localhost/post_output.php"; $post_data = array ("foo" => "bar", "query" => "Nettuts", "action" => "Submit"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем, что у нас POST запрос curl_setopt($ch, CURLOPT_POST, 1); // добавляем переменные curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

    При запуске данного скрипта вы должны получить подобный результат:

    Таким образом, POST запрос был отправлен скрипту post_output.php, который в свою очередь, вывел суперглобальный массив $_POST, содержание которого мы получили при помощи cURL.

    Загрузка файла

    Сначала давайте создадим файл для того, чтобы сформировать его и отправить файлу upload_output.php:

    Print_r($_FILES);

    А вот и код скрипта, который выполняет указанный выше функционал:

    $url = "http://localhost/upload_output.php"; $post_data = array ("foo" => "bar", // файл, который необходимо загрузить "upload" => "@C:/wamp/www/test.zip"); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); $output = curl_exec($ch); curl_close($ch); echo $output;

    Когда вы хотите загрузить файл, все, что вам нужно сделать, так это передать его как обычную post переменную, предварительно поместив перед ней символ @. При запуске написанного скрипта вы получите следующий результат:

    Множественный cURL

    Одной из самых сильных сторон cURL является возможность создания "множественных" cURL обработчиков. Это позволяет вам открывать соединение к множеству URL одновременно и асинхронно.

    В классическом варианте cURL запроса выполнение скрипта приостанавливается, и происходит ожидание завершения операции URL запроса, после чего работа скрипта может продолжиться. Если вы намереваетесь взаимодействовать с целым множеством URL, это приведёт к довольно-таки значительным затратам времени, поскольку в классическом варианте вы можете работать только с одним URL за один раз. Однако, мы можем исправить данную ситуацию, воспользовавшись специальными обработчиками.

    Давайте рассмотрим пример кода, который я взял с php.net:

    // создаём несколько cURL ресурсов $ch1 = curl_init(); $ch2 = curl_init(); // указываем URL и другие параметры curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/"); curl_setopt($ch1, CURLOPT_HEADER, 0); curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/"); curl_setopt($ch2, CURLOPT_HEADER, 0); //создаём множественный cURL обработчик $mh = curl_multi_init(); //добавляем несколько обработчиков curl_multi_add_handle($mh,$ch1); curl_multi_add_handle($mh,$ch2); $active = null; //выполнение do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) != -1) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } //закрытие curl_multi_remove_handle($mh, $ch1); curl_multi_remove_handle($mh, $ch2); curl_multi_close($mh);

    Идея состоит в том, что вы можете использовать множественные cURL обработчики. Используя простой цикл, вы можете отследить, какие запросы ещё не выполнились.

    В этом примере есть два основных цикла. Первый цикл do-while вызывает функцию curl_multi_exec(). Эта функция не блокируемая. Она выполняется с той скоростью, с которой может, и возвращает состояние запроса. Пока возвращенное значение является константой ‘CURLM_CALL_MULTI_PERFORM’, это означает, что работа ещё не завершена (например, в данный момент происходит отправка http заголовков в URL); Именно поэтому мы продолжаем проверять это возвращаемое значение, пока не получим другой результат.

    В следующем цикле мы проверяем условие, пока переменная $active = "true". Она является вторым параметром для функции curl_multi_exec(). Значение данной переменной будет равно "true", до тех пор, пока какое-то из существующих изменений является активным. Далее мы вызываем функцию curl_multi_select(). Её выполнение "блокируется", пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов.

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

    Проверяем ссылки в WordPress

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

    Мы собираемся создать скрипт, который проанализирует все ссылки и найдёт незагружающиеся веб-сайты и страницы 404, после чего предоставит нам подробнейший отчёт.

    Сразу же скажу, что это не пример создания плагина для WordPress. Это всего на всего хороший полигон для наших испытаний.

    Давайте же наконец начнём. Сначала мы должны сделать выборку всех ссылок из базы данных:

    // конфигурация $db_host = "localhost"; $db_user = "root"; $db_pass = ""; $db_name = "wordpress"; $excluded_domains = array("localhost", "www.mydomain.com"); $max_connections = 10; // инициализация переменных $url_list = array(); $working_urls = array(); $dead_urls = array(); $not_found_urls = array(); $active = null; // подключаемся к MySQL if (!mysql_connect($db_host, $db_user, $db_pass)) { die("Could not connect: " . mysql_error()); } if (!mysql_select_db($db_name)) { die("Could not select db: " . mysql_error()); } // выбираем все опубликованные посты, где есть ссылки $q = "SELECT post_content FROM wp_posts WHERE post_content LIKE "%href=%" AND post_status = "publish" AND post_type = "post""; $r = mysql_query($q) or die(mysql_error()); while ($d = mysql_fetch_assoc($r)) { // делаем выборку ссылок при помощи регулярных выражений if (preg_match_all("!href=\"(.*?)\"!", $d["post_content"], $matches)) { foreach ($matches as $url) { $tmp = parse_url($url); if (in_array($tmp["host"], $excluded_domains)) { continue; } $url_list = $url; } } } // убираем дубликаты $url_list = array_values(array_unique($url_list)); if (!$url_list) { die("No URL to check"); }

    Сначала мы формируем конфигурационные данные для взаимодействия с базой данных, далее пишем список доменов, которые не будут участвовать в проверке ($excluded_domains). Также мы определяем число, характеризующее количество максимальных одновременных соединений, которые мы будем использовать в нашем скрипте ($max_connections). Затем мы присоединяемся к базе данных, выбираем посты, которые содержат ссылки, и накапливаем их в массив ($url_list).

    Следующий код немного сложен, так что разберитесь в нём от начала до конца:

    // 1. множественный обработчик $mh = curl_multi_init(); // 2. добавляем множество URL for ($i = 0; $i < $max_connections; $i++) { add_url_to_multi_handle($mh, $url_list); } // 3. инициализация выполнения do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 4. основной цикл while ($active && $mrc == CURLM_OK) { // 5. если всё прошло успешно if (curl_multi_select($mh) != -1) { // 6. делаем дело do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); // 7. если есть инфа? if ($mhinfo = curl_multi_info_read($mh)) { // это значит, что запрос завершился // 8. извлекаем инфу $chinfo = curl_getinfo($mhinfo["handle"]); // 9. мёртвая ссылка? if (!$chinfo["http_code"]) { $dead_urls = $chinfo["url"]; // 10. 404? } else if ($chinfo["http_code"] == 404) { $not_found_urls = $chinfo["url"]; // 11. рабочая } else { $working_urls = $chinfo["url"]; } // 12. чистим за собой curl_multi_remove_handle($mh, $mhinfo["handle"]); // в случае зацикливания, закомментируйте данный вызов curl_close($mhinfo["handle"]); // 13. добавляем новый url и продолжаем работу if (add_url_to_multi_handle($mh, $url_list)) { do { $mrc = curl_multi_exec($mh, $active); } while ($mrc == CURLM_CALL_MULTI_PERFORM); } } } } // 14. завершение curl_multi_close($mh); echo "==Dead URLs==\n"; echo implode("\n",$dead_urls) . "\n\n"; echo "==404 URLs==\n"; echo implode("\n",$not_found_urls) . "\n\n"; echo "==Working URLs==\n"; echo implode("\n",$working_urls); function add_url_to_multi_handle($mh, $url_list) { static $index = 0; // если у нас есть ещё url, которые нужно достать if ($url_list[$index]) { // новый curl обработчик $ch = curl_init(); // указываем url curl_setopt($ch, CURLOPT_URL, $url_list[$index]); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($ch, CURLOPT_NOBODY, 1); curl_multi_add_handle($mh, $ch); // переходим на следующий url $index++; return true; } else { // добавление новых URL завершено return false; } }

    Тут я попытаюсь изложить всё по полочкам. Числа в списке соответствуют числам в комментарии.

    1. 1. Создаём множественный обработчик;
    2. 2. Функцию add_url_to_multi_handle() мы напишем чуть позже. Каждый раз, когда она будет вызываться, начнётся обработка нового url. Первоначально, мы добавляем 10 ($max_connections) URL;
    3. 3. Для того чтобы начать работу, мы должны запустить функцию curl_multi_exec(). До тех пор, пока она будет возвращать CURLM_CALL_MULTI_PERFORM, нам ещё есть, что делать. Это нам нужно, главным образом, для того, чтобы создать соединения;
    4. 4. Далее следует основной цикл, который будет выполняться до тех пор, пока у нас есть хоть одно активное соединение;
    5. 5. curl_multi_select() зависает в ожидании, пока поиск URL не завершится;
    6. 6. И снова мы должны заставить cURL выполнить некоторую работу, а именно, сделать выборку данных возвращаемого ответа;
    7. 7. Тут происходит проверка информации. В результате выполнения запроса будет возвращён массив;
    8. 8. В возвращенном массиве присутствует cURL обработчик. Его мы и будем использовать для того, чтобы выбрать информацию об отдельном cURL запросе;
    9. 9. Если ссылка была мертва, или время выполнения скрипта вышло, то нам не следует искать никакого http кода;
    10. 10. Если ссылка возвратила нам страницу 404, то http код будет содержать значение 404;
    11. 11. В противном случае, перед нами находится рабочая ссылка. (Вы можете добавить дополнительные проверки на код ошибки 500 и т.д...);
    12. 12. Далее мы удаляем cURL обработчик, потому что больше в нём не нуждаемся;
    13. 13. Теперь мы можем добавить другой url и запустить всё то, о чём говорили до этого;
    14. 14. На этом шаге скрипт завершает свою работу. Мы можем удалить всё, что нам не нужно и сформировать отчет;
    15. 15. В конце концов, напишем функцию, которая будет добавлять url в обработчик. Статическая переменная $index будет увеличиваться каждый раз, когда данная функция будет вызвана.

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

    В моём случае, скрипту потребовалось чуть меньше чем 2 секунды, чтобы пробежаться по 40 URL. Увеличение производительности является существенным при работе с еще большим количеством URL адресов. Если вы открываете десять соединений одновременно, то скрипт может выполниться в десять раз быстрее.

    Пару слов о других полезных опциях cURL

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

    Если на URL адресе есть HTTP аутентификация, то вы без труда можете воспользоваться следующим скриптом:

    $url = "http://www.somesite.com/members/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем имя и пароль curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); // если перенаправление разрешено curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // то сохраним наши данные в cURL curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1); $output = curl_exec($ch); curl_close($ch);

    FTP загрузка

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

    // открываем файл $file = fopen("/path/to/file", "r"); // в url должно быть следующее содержание $url = "ftp://username:[email protected]:21/path/to/new/file"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file")); // указывам ASCII мод curl_setopt($ch, CURLOPT_FTPASCII, 1); $output = curl_exec($ch); curl_close($ch);

    Используем Прокси

    Вы можете выполнить свой URL запрос через прокси:

    $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://www.example.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // указываем адрес curl_setopt($ch, CURLOPT_PROXY, "11.11.11.11:8080"); // если необходимо предоставить имя пользователя и пароль curl_setopt($ch, CURLOPT_PROXYUSERPWD,"user:pass"); $output = curl_exec($ch); curl_close ($ch);

    Функции обратного вызова

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

    $ch = curl_init(); curl_setopt($ch, CURLOPT_URL,"http://net.tutsplus.com"); curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function"); curl_exec($ch); curl_close ($ch); function progress_function($ch,$str) { echo $str; return strlen($str); }

    Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.

    Заключение

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

    Спасибо! Удачного дня!

    c URL очень полезный инструмент командной строки для передачи данных от или к серверу. Curl поддерживает различные протоколы, такие как FILE, HTTP, HTTPS, IMAP, IMAPS, LDAP, DICT, LDAPS, TELNET, FTPS, GOPHER, RTMP, RTSP, SCP, SFTP, POP3, POP3S, SMB, SMBS, SMTP, SMTPS, и TFTP.

    cURL может быть использован самыми различными и интересными способами. С помощью этого инструмента вы можете скачать, загрузить файлы и управлять ими, проверить свой адрес электронной почты, или даже обновлять свой статус на некоторых веб – сайтах социальных медиа или проверить погоду на улице. В этой статье мы рассмотрим пять наиболее полезных и основных видов использования инструмента cURL на любой .

    1. Проверьте URL

    Одним из наиболее распространенных и простейших применений cURL печатает саму команду, а затем URL, который вы хотите проверить

    Curl https://domain.ru

    Эта команда будет отображать содержимое URL на вашем терминале

    2. Сохраните вывод URL в файл

    Curl -o website https://domain.ru % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 41793 0 41793 0 0 275k 0 --:--:-- --:--:-- --:--:-- 2.9M

    В этом примере, вывод будет сохранен в файл с именем ‘website’ в текущем рабочем каталоге.

    3. Загрузка файлов с помощью Curl

    Вы можете скачивать файлы при помощи Curl, путем добавления опции -o к команде. Он используется для сохранения файлов на локальном сервере с теми же именами, как и на удаленном сервере

    Curl -O https://domain.ru/file.zip

    В этом примере архив ‘file.zip’ будет загружен в текущий рабочий каталог.

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

    Curl -o archive.zip https://domain.ru/file.zip

    Таким образом, архив ‘file.zip’ будет загружен и сохранен как ‘Archive.zip’.

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

    Curl -O https://domain.ru/file.zip -O https://domain.com/file2.zip

    Curl также можно использовать для загрузки файлов надежно через SSH с помощью следующей команды

    Curl -u user sftp://server.domain.ru/path/to/file

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

    4. Взять информацию из заголовка HTTP веб-сайта

    Вы можете легко получить информацию заголовка HTTP из любого веб-сайта, добавив опцию -I (‘i’) к cURL.

    Curl -I http://domain.ru HTTP/1.1 200 OK Date: Sun, 16 Oct 2016 23:37:15 GMT Server: Apache/2.4.23 (Unix) X-Powered-By: PHP/5.6.24 Connection: close Content-Type: text/html; charset=UTF-8

    5. Доступ к FTP-серверу

    Чтобы получить доступ к FTP-серверу с помощью Curl, надо использовать следующую команду

    Curl ftp://ftp.domain.ru --user username:password

    Curl будет подключаться к FTP-серверу и выведет список всех файлов и каталогов в домашнем каталоге пользователя

    Вы можете скачать файл с помощью FTP

    Curl ftp://ftp.domain.ru/file.zip --user username:password

    и загрузить файл на сервер FTP

    Curl -T file.zip ftp://ftp.domain.ru/ --user username:password

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

    Man curl

    PS. Если вам понравился этот пост, пожалуйста поделитесь им с друзьями в социальных сетях с помощью кнопок ниже или просто оставьте комментарий. Благодарю.

    Похожие статьи