Curl windows описание. PHP CURL – функции и примеры использования
(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.
|
|
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_*
.
|
Удалена в 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 .
|
|
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, второй - общим количеством байт, которое ожидается загрузить с сервера, третий - количество уже загруженных байт, четвертый - общее количество байт, которое ожидается отправить на сервер, и пятый - количество уже отправленных байт.
Можно вернуть ненулевое значение, чтобы отменить передачу. В этом случае будет выставлена ошибка 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 /* http://localhost/upload.php:
$ch
=
curl_init
();
$data
= array("name"
=>
"Foo"
,
"file"
=>
"@/home/user/test.png"
); Curl_setopt
($ch
,
CURLOPT_URL
,
"http://localhost/upload.php"
); 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. На самом деле, существует немало альтернативных способов выборки содержания веб-страницы. Во многих случаях, главным образом из-за лени, я использовал простые 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, основанные на различных настройках браузера. Например, некоторые веб-сайты перенаправляют браузеры сотового телефона, или любого другого устройства. Мы собираемся использовать опцию 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:” в полученных заголовках. Когда вы запустите данный код, то должны будете получить примерно следующий результат: При формировании 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 обработчиков. Это позволяет вам открывать соединение к множеству 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(). Её выполнение "блокируется", пока существует хоть одно активное соединение, до тех пор, пока не будет получен ответ. Когда это произойдёт, мы возвращаемся в основной цикл, чтобы продолжить выполнение запросов. А теперь давайте применим полученные знания на примере, который будет реально полезным для большого количества людей. Представьте себе блог с огромным количеством постов и сообщений, в каждом из которых есть ссылки на внешние интернет ресурсы. Некоторые из этих ссылок по различным причинам могли бы уже быть «мертвыми». Возможно, страница была удалена или сайт вовсе не работает. Мы собираемся создать скрипт, который проанализирует все ссылки и найдёт незагружающиеся веб-сайты и страницы 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;
}
} Тут я попытаюсь изложить всё по полочкам. Числа в списке соответствуют числам в комментарии. Я использовал данный скрипт на своем блоге (с некоторыми неработающими ссылками, которые добавил нарочно для того, чтобы протестировать его работу) и получил следующий результат: В моём случае, скрипту потребовалось чуть меньше чем 2 секунды, чтобы пробежаться по 40 URL. Увеличение производительности является существенным при работе с еще большим количеством URL адресов. Если вы открываете десять соединений одновременно, то скрипт может выполниться в десять раз быстрее. Если на 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); В 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 в своих корыстных целях. Я надеюсь, что вам понравилась данная статья. Спасибо! Удачного дня! CURL
— инструмент командной строки для получения или отправки данных с использованием синтаксиса URL. Если вы работаете в службе поддержки, то должны уметь использовать команды cURL для устранения неполадок веб-приложений. cURL
— кроссплатформенная утилита для Windows, MAC и UNIX. Если вы работаете в UNIX-системе и пытаетесь подключиться к внешнему URL-адресу, то сначала проверьте наличие доступа к ресурсу через curl
. Для этого используйте следующую команду: # curl yoururl.com # curl yoururl.com > yoururl.html Например: # curl 74.125.68.100 >/tmp/google.html Приведенный выше пример сохранит все содержимое с хоста 74.125.68.100 в файл /tmp/google.html
. Если хотите удостовериться, что получаете ожидаемый заголовок запроса и ответа, используйте следующую команду: # curl -v yoururl.com например: # curl -v 74.125.68.100
* About to connect() to 74.125.68.100 port 80 (#0)
* Trying 74.125.68.100...
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
>Host: 74.125.68.100
>Accept: */*
>< HTTP/1.1 200 OK
Если нужно узнать, сколько времени требуется для загрузки с определенной скоростью, то используйте следующую команду: # curl –-limit-rate 2000B например: # curl –-limit-rate 2000B 74.125.68.100 Если необходимо проверить, можно ли использовать прокси-сервер, примените следующий синтаксис: # curl --proxyyourproxy:port http://yoururl.com Для устранения конкретной проблемы можно использовать Curl
, чтобы вставить в header
свои данные. Рассмотрим следующий пример запроса с Content-Type: # curl --header "Content-Type: application/json" http://yoururl.com Мы просим curl
передать Content-Type в качестве application / json
в заголовок запроса. Вы можете добавить заголовок к запросу с помощью синтаксиса — header
. # curl –-header “X-CustomHeader: GeekFlare” http://yoururl.com например: # curl -v --header "X-CustomHeader: GeekFlare" 74.125.68
* About to connect() to 74.125.68.100 port 80 (#0)
* Trying 74.125.68.100...
* Connected to 74.125.68.100 (74.125.68.100) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
>Host: 74.125.68.100
>Accept: */*
> X-CustomHeader: GeekFlare
>< HTTP/1.1 200 OK
Если вы хотите быстро проверить заголовок ответа, то для этого можно использовать следующий синтаксис. # curl --head http://yoururl.com # curl -I 74.125.68.100
HTTP/1.1 200 OK
Date: Sun, 18 Jan 2015 08:31:22 GMT
Expires: -1
Cache-Control:
private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: NID=67=SpnXKTDUhw7QGakIeLxmDSF;
expires=Mon, 20-Jul-2015 08:31:22 GMT; path=/; domain=.; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for moreinfo."
Server: gws X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Alternate-Protocol: 80:quic,p=0.02
Transfer-Encoding: chunked
Accept-Ranges: none
Vary: Accept-Encoding
# Если необходимо получить доступ к https URL-адресу, который выдает ошибку сертификата из-за несоответствия имени хоста, можно использовать следующий синтаксис. curl --insecure https://yoururl.com Чтобы подключиться к URL- адресу только по протоколу SSL V2 / V3
или TLS
,используйте следующий синтаксис. Для подключения с использованием SSLV2: # curl --sslv2 https://yoururl.com Для подключения с использованием SSLV3: # curl --sslv3 https://yoururl.com Для подключения через TLS: # curl --tlsv1 https://yoururl.com С помощью cURL
можно загрузить файл с ftp-сервера
, указав имя пользователя и пароль. # curl -u user:password -O ftp://ftpurl/style.css Всегда можно использовать «-v» с любым синтаксисом для вывода в подробном режиме. Да, это возможно. Вы можете выполнить cURL
удаленно с помощью следующих инструментов. Connect-timeout
--cookie
--data
--header
--head
--location
--max-time
--proxy
--request
--user
--url
--user-agent Пример вывода: cURL command line builder
–позволяет создать команду cURL, с помощью которой можно ввести информацию в пользовательский интерфейс. CURL - это пакет программного обеспечения, состоящий из утилиты командной строки и библиотеки для передачи данных с использованием синтаксиса URL. CURL поддерижвает множество протоколов, среди них DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet и TFTP. Загрузить отдельный файл
$ch
=
curl_init
();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt
($ch
,
CURLOPT_POST
,
1
);
curl_setopt
($ch
,
CURLOPT_POSTFIELDS
,
$data
);
?>
Примечания
Почему cURL?
Базовая структура
Проверка Ошибки
Получение информации
Обнаружение перенаправления в зависимости от браузера
Создание POST запроса на определённый URL
Загрузка файла
Множественный cURL
Проверяем ссылки в WordPress
Пару слов о других полезных опциях cURL
HTTP Аутентификация
FTP загрузка
Используем Прокси
Функции обратного вызова
Заключение
Ниже приведены некоторые часто используемые примеры синтаксиса.1. Проверка возможности подключения к URL-адресу
2. Сохранение вывод URL / URI в файл
3. Показать заголовок запроса и ответа
4. Загрузить с предельной скоростью
5. Использование прокси для подключения
6. Проверка URL-адресас введением заголовка
7. Добавить дополнительный заголовок
8. Открыть только заголовок ответа
9. Подключить HTTPS / SSLURL-адрес и игнорировать любые ошибки SSL -сертификата
10. Подключиться с использованием определенного протокола (SSL / TLS)
11. Загрузить файл с FTP-сервера
Использования cURL онлайн
Online CURL
— компактный инструмент для извлечения URL-адреса онлайн и добавления следующих параметров.
Следующая команда получит содержимое URL и отобразит его в стандартном выводе (т. е. в вашем терминале).
Curl https://mi-al.ru/ > mi-al.htm % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 14378 0 14378 0 0 5387 0 --:--:-- 0:00:02 --:--:-- 5387
Сохранение вывода cURL в файлМы можем сохранить результат команды curl в файл, используя опции -o/-O.
- -o (o нижнего регистра) результат будет сохранён в файле, заданном в командной строке
- -O (O верхнего регистра) имя файла будет взято из URL и будет использовано для сохранения полученных данных.
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
Теперь будет сохранена страница gettext.html в файле с названием ‘mygettext.html’. Когда curl запущена с опцией -o, она отображает шкалу прогресса загрузки следующим образом.
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900 100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987
Когда вы используете curl -O (O верхнего регистра), она сама по себе сохранит содержимое в файл под названием ‘gettext.html’ на локальной машине.
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
Примечание: Когда curl должна писать данные в терминал, она отключает шкалу прогресса, чтобы не было путаницы в напечатанных данных. Мы можем исользовать ‘>’|’-o’|’-O’ опции для передачи результатов в файл.
Выборка нескольких файлов одновременно
Мы можем загрузить несколько файлов за один раз, задав все URL в командной строке.
Curl -O URL1 -O URL2
Команда ниже загрузит оба index.html и gettext.html и сохранит их с теми же именами в текущей директории.
Curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html
Пожалуйста, обратите внимание, когда мы загружаем несколько файлов с одного сервера как показано выше, curl попытается повторно использовать соединение.
Следуем за HTTP Location в заголовках с опцией -L
По умолчанию, CURL не следует за HTTP Location в заголовках (редиректы). Когда запрошенная веб-страница перемещена в другое место, то соответствующий ответ будет передан в заголовках HTTP Location.
Например, когда кто-то печатает google.com в строке браузера из своей страны, они автоматически будут перенаправлены на ‘google.co.xx’. Это делается на основе заголовка HTTP Location как показано ниже.
Curl https://www.google.com/?gws_rd=ssl
302 Moved
The document has moved here.Приведённый выше вывод говорит, что запрашиваемый документ был перемещён в ‘
Скрыто от гостей
.Вы можете указать curl следовать редиректам, это делается с использованием опции -L как показано ниже. Теперь будет загружен исходный код html с
Скрыто от гостей
.Curl -L https://www.google.com/?gws_rd=ssl
Вообновление предыдущей закачкиИспользуя опцию -C вы можете продолжить закачку, которая была остановлена по каким-либо причинам. Это будет полезным при обрыве загрузки больших файлов.
Если мы говорим ‘-C -’, то curl будет искать, с какого места возобновить загрузку. Мы также можем задать ‘-C <смещение>’. Заданное смещение байт будет пропущено от начала исходного файла.
Начните большую загрузку с curl и нажмите Ctrl-C для остановки посреди закачки.
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html ############## 20.1%
Закачка была остановлена на 20.1%. Используя “curl -C -” мы можем продолжить загрузку с того места, где мы остановились. Теперь загрузка продолжиться с 20.1%.
Curl -C - -O http://www.gnu.org/software/gettext/manual/gettext.html ############### 21.1%
Ограничение скорости передачи данныхВы можете ограничить величину скорости передачи данных опцией –limit-rate. Вы можете передать максимальную скорость в качестве аргумента.
$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
Команда выше ограничит скорость передачи на 1000 байт/секунду. curl может использовать скорость выше на пиках. Но средняя скорость будет примерно 1000 байт/секунду.
Ниже показан индикатор прогресса для представленной выше команды. Вы можете видеть, что текущая скорость в районе 1000 байт.
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999 1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999 1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999
Загрузить файл только если он изменён до/после заданного времениВы можете получить файлы, которые были изменены после определённого времени, используя опцию -z в curl. Это будет работать и для FTP и для HTTP.
Команда выше загрузит yy.html только если он изменялся позднее чем заданная дата и время.
Команда выше загрузит файл file.html, если он изменялся до заданной даты и времени. Наберите ‘man curl_getdate’ чтобы узнать больше о различных поддерживаемых синтаксисах для выражений даты.
Прохождение аутентификации HTTP в cURL
Иногда веб-сайты требуют имя пользователя и пароль для просмотра их содержимого. С помощью опции -u вы можете передать эти учётные данные из cURL на веб-сервер как показано ниже.
$ curl -u username:password URL
Примечание: По умолчанию curl использует базовую HTTP аутентификацию. Мы можем задать иные методы аутентификации используя –ntlm | –digest.
cURL может также использоваться для загрузки файлов с FTP серверов. Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней.
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
Команда выше загрузит файл xss.php с ftp-сервера и сохранит его в локальной директории.
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
Здесь URL отсылает к директории. Следовательно, cURL сделает список файлов и директорий по заданному URL адресу.
CURL поддерживает диапазоны заданные в URL. Когда дан диапазон, будут загружены соответствующие файлы внутри этого диапазона. Это будет полезным при загрузке пакетов с сайтов FTP зеркал.
$ curl ftp://ftp.uk.debian.org/debian/pool/main//
Команда выше сделает список всех пакетов в диапазоне a-z в терминале.
Выгрузка файлов на FTP-сервер
Curl также может использоваться для выгрузки на FTP-сервер с опцией -T.
$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
Команда выше выгрузит файл с именем myfile.txt на FTP-сервер. Вы можете также выгрузить несколько файлов за один раз используя диапазоны.
$ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
Опционально мы можем использовать “.” для получения из стандартного ввода и передачи его на удалённую машину.
$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
Команда выше получит вывод от пользователя из стандартного ввода и сохранит содержимое на ftp-сервере под именем ‘myfile_1.txt’.
Вы можете задать ‘-T’ для каждого URL, и каждая пара адрес-файл будут определять что куда выгружать
Больше информации с увеличением вербальности и опцией трассировки
Вы можете узнать что происходит, используя опцию -v. Опция -v включает вербальный режим и будет печатать подробности.
Curl -v https://www.google.co.th/?gws_rd=ssl
Команда выше выведет следующее
* Rebuilt URL to: https://www.google.co.th/?gws_rd=ssl * Hostname was NOT found in DNS cache * Trying 27.123.17.49... * Connected to www.google.co.th (27.123.17.49) port 80 (#0) > GET / HTTP/1.1 > User-Agent: curl/7.38.0 > Host: www.google.co.th > Accept: */* > < HTTP/1.1 200 OK < Date: Fri, 14 Aug 2015 23:07:20 GMT < Expires: -1 < Cache-Control: private, max-age=0 < Content-Type: text/html; charset=windows-874 < P3P: CP="This is not a P3P policy! See https://support.google.com/accounts/answer/151657?hl=en for more info." * Server gws is not blacklisted < Server: gws < X-XSS-Protection: 1; mode=block < X-Frame-Options: SAMEORIGIN < Set-Cookie: PREF=ID=1111111111111111:FF=0:TM=1439593640:LM=1439593640:V=1:S=FfuoPPpKbyzTdJ6T; expires=Sun, 13-Aug-2017 23:07:20 GMT; path=/; domain=.google.co.th ... ... ...
Если вам нужно больше детальной информации, тогда вы можете использовать опцию –trace. Опция –trace включит полный дамп трассировки всех входящих/исходящих данных для заданного файла
Реальный практический пример: вам нужно перезагрузить роутер (модем) для смены IP адреса. Для этого нужно: авторизоваться в роутере, перейти к странице обслуживания и нажать кнопку «Перезагрузка». Если это действие нужно выполнить несколько раз, то процедуру нужно повторить. Согласитесь, делать каждый раз в ручную эту рутину не хочется. cURL позволяет автоматизировать всё это. Буквально несколькими командами cURL можно добиться авторизации и выполнения задания на роутере.
- cURL удобен для получения данных с веб-сайтов в командной строке.
Т.е. случаи использования cURL вполне реальные, хотя, в большинстве, cURL нужна программистам, которые используют её для своих программ.
CURL поддерживает множество протоколов и способов авторизации, умеет передавать файлы, правильно работает с кукиз, поддерживает SSL сертификаты, прокси и очень многое другое.
cURL в PHP и командной строке
Мы можем использовать cURL двумя основными способами: в скриптах PHP и в командной строке.
Чтобы включить cURL в PHP на сервере, необходимо в файле php.ini раскомментировать строку
Extension=php_curl.dll
А затем перезагрузить сервер.
На Linux необходимо установить пакет curl.
На Debian, Ubuntu или Linux Mint:
$ sudo apt-get install curl
На Fedora, CentOS или RHEL:
$ sudo yum install curl
Чтобы наглядно было видно разницу в использовании в PHP и в командной строке, будем одни и те же задачи выполнять дважды: сначала в скрипте PHP, а затем в командной строке. Постараемся при этом не запутаться.
Получение данных при помощи cURL
Получение данных при помощи cURL в PHP
Пример на PHP:
Всё очень просто:
$target_url
- адрес сайта, который нас интересует. После адреса сайта можно поставить двоеточие и добавить адрес порта (если порт отличается от стандартного).
curl_init - инициализирует новый сеанс и возвращает дискриптор, который в нашем примере присваивается переменной $ch .
Затем мы выполняем запрос cURL функцией curl_exec , которой в качестве параметра передаётся дискриптор.
Всё очень логично, но при выполнении этого скрипта, на нашей странице отобразиться содержимое сайта. А что если мы не хотим отображать содержимое, а хотим записать его в переменную (для последующей обработки или парсинга).
Чуть дополним наш скрипт:
0) { echo "Ошибка curl: " . curl_error($ch); } curl_close($ch); ?>
У нас появилась строчка curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); .
curl_setopt - задаёт опции. Полный список опций можно найти на этой странице:
Скрыто от гостей
$response_data = curl_exec($ch);
Теперь значение скрипта присваивается переменной $response_data, с которой можно проводить дальнейшие операции. Например, можно вывести её содержимое.
Строчки
If (curl_errno($ch) > 0) { echo "Ошибка curl: " . curl_error($ch); }
служат для отладки, на случай возникновения ошибок.
Получение данных при помощи cURL в командной строке
В командной строке достаточно набрать
где вместо mi-al.ru - адрес вашего сайта.
Если нужно скопировать данные в переменную, а не выводить полученный результат на экран, то делаем так:
Temp="curl mi-al.ru"
При этом всё равно выводятся некие данные:
Чтобы они не выводились, добавляем ключ -s
:
Temp="curl -s mi-al.ru"
Можно посмотреть, что записалось:
Echo $temp | less
Базовая аутентификация и аутентификация HTTPАутентификация, проще говоря, это введение имени пользователя и пароля.
Базовая аутентификация - это аутентификация средствами сервера. Для этого создаются два файла: .htaccess и .htpasswd
Содержимое файла.htaccess примерно такое
AuthName "Только для зарегистрированных пользователей!" AuthType Basic require valid-user AuthUserFile /home/freeforum.biz/htdocs/.htpassw
Содержимое файла.htpasswd примерно такое:
Mial:CRdiI.ZrZQRRc
Т.е. логин и хэш пароля.
При попытке получить доступ к запароленной папке, в браузере отобразиться примерно такое окно:
HTTP аутентификация - это тот случай, когда мы вводим логин и пароль в форму на сайте. Именно такая аутентификация используется при входе в почту, на форумы и т. д.
Базовая аутентификация cURL (PHP)
Есть сайт
Скрыто от гостей
Пробуем наш первоначальный скрипт:
0) { echo "Ошибка curl: " . curl_error($ch); } else { echo $response_data; } curl_close($ch); ?>
Хотя скрипт и считает, что ошибки нет, но выводимый результат нам совсем не нравится:
Добавляем две строки:
Curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); curl_setopt($ch, CURLOPT_USERPWD, "ru-board:ru-board");
Первой строкой мы задаём тип аутентификации - базовая. Вторая строка содержит имя и пароль через двоеточие (в нашем случае имя и пароль одинаковые - ru-board). Получилось так:
0) { echo "Ошибка curl: " . curl_error($ch); } else { echo $response_data; } curl_close($ch); ?> Пробуем: 30946 Отлично! Базовая аутентификация cURL (в командной строке) Этого же самого в командной строке можно добиться одной строчкой: curl -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/
Я не забыл указать тип аутентификации, просто в cURL базовый тип аутентификации является дефолтным.
В командной строке всё получилось так быстро, что от расстройства я написал вот такую программу. Она подключается к сайту и скачивает самое последнее обновление:
Temp=`curl -s -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/ | grep -E -o "Update_FED_201{1}.{2}.{2}.7z" | uniq | tail -n 1`; curl -o $temp -u ru-board:ru-board http://62.113.208.29/Update_FED_DAYS/$temp
Буквально ещё несколькими командами можно добавить:
- распаковку архива в указанный каталог;
- запуск обновлений КонсультантПлюс (это обновления для него);
- можно реализовать проверку - было ли уже скачено последнее доступное обновление или появилось новое;
- добавить это всё в Cron для ежедневных обновлений.
HTTP аутентификация cURL в PHP
Нам нужно знать:
- адрес, куда отправлять данные для аутентификации
- метод отправки GET или POST
- логин
- пароль
Адрес, куда нужно отправить данные, можно взять из формы аутентификации. Например: