PHP CURL – функции и примеры использования. Продвинутое использование cURL в 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 — это инструмент, позволяющий взаимодействовать с различными серверами и поддерживающий множество протоколов: HTTP, FTP, TELNET и др. Изначально cURL — это служебная программа для командной строки. Но, к счастью для нас, PHP поддерживает работу с библиотекой cURL. В этой статье мы рассмотрим нетривиальные примеры работы с cURL. На самом деле, есть много других способов отправить запрос на другой сервер чтобы, например, получить содержимое страницы. Многие, в основном из-за лени, используют простые PHP функции, вместо cURL:
$content = file_get_contents("http://www.example.com");
// или
$lines = file("http://www.example.com");
// или
readfile("http://www.example.com");
Однако они не позволяют эффективно обрабатывать ошибки. Также есть ряд задач, которые им вовсе не под силу — например, работа с cookies, авторизация, post запросы, загрузка файлов. cUrl — мощный инструмент, который поддерживает множество протоколов и предоставляет полную информацию о запросе. Прежде чем перейти к сложным примерам, рассмотрим базовую структуру cURL запроса в PHP. Для выполнения cURL запроса в PHP необходимо сделать 4 основных шага: В основном в этой статье мы будем рассматривать шаг №2, так как там происходит основная магия. Список cURL опций очень большой, поэтому все опции рассматривать сегодня мы не будем, а используем те, которые пригодятся для решения конкретных задач. При необходимости, вы можете добавить следующие строки для отслеживания ошибок:
// ...
$output = curl_exec($ch);
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch);
}
// ...
Обратите внимание, мы используем «===» вместо «==», т.к. надо отличать пустой ответ сервера от булевского значения FALSE, которое возвращается в случае ошибки. Другой необязательный шаг — получение информации о cURL запросе, после его выполнения.
// ...
curl_exec($ch);
$info = curl_getinfo($ch);
echo "Took " . $info["total_time"] . " seconds for url " . $info["url"];
// ...
В результате вы получите массив со следующей информацией: В этом примере мы напишем скрипт, который будет определять перенаправления в зависимости от разных настроек браузера. Например, некоторые сайты перенаправляют посетителей с мобильных устройств, посетителей из других стран. Мы будем использовать опцию CURLOPT_HTTPHEADER для установки наших собственных заголовков, включая User-Agent и язык и посмотрим, куда перенаправляют нас сайты.
// URLs
$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();
// установим адрес
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);
// нужны только заголовки
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 и тестируемый браузер и язык. Т.к. мы установили специальную опцию, результат выполнения запроса будет содержать только HTTP заголовки. С помощью простого регулярного выражения мы можем проверить содержит ли ответ строку «Location:». Результат выполнения скрипта: URL: http://www.cnn.com
standard: redirects to http://edition.cnn.com/
iphone: redirects to http://edition.cnn.com/
french: redirects to http://edition.cnn.com/
URL: http://www.mozilla.com
standard: redirects to https://www.mozilla.org/firefox/
iphone: redirects to https://www.mozilla.org/firefox/
french: redirects to https://www.mozilla.org/firefox/
URL: http://www.facebook.com
standard: redirects to https://www.facebook.com/
iphone: redirects to http://m.facebook.com/?refsrc=http%3A%2F%2Fwww.facebook.com%2F&_rdr
french: no redirection
При выполнении GET запросов данные можно передавать в строке запроса. Например, когда вы ищете в гугле, ваш запрос передается в URL: Http://www.google.com/search?q=google
Чтобы получить результат этого запроса, вам даже не понадобится cURL, вы можете быть ленивым и использовать «file_get_contents()». Но некоторые HTML формы используют метод POST. В таком случае данные отправляются в теле сообщения запроса, а не в самом URL. Напишем скрипт, который будет отправлять POST запросы. Для начала создадим простой PHP файл, который будет принимать эти запросы и возвращать отправленные ему данные. Назовем его post_output.php
:
$url = "http://localhost/post_output.php";
$post_data = array ("foo" => "bar",
"query" => "FooBar",
"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;
Данный скрипт выведет: Array
( => bar
=> FooBar
=> Submit)
Данный скрипт отправил POST запрос файлу post_output.php. который вывел содержимое массива $_POST и мы получили этот ответ с помощью cURL. Так же как и в предыдущем примере, создадим файл, который будет принимать запросы, upload_output.php
: Print_r($_FILES);
И сам скрипт, загружающий файлы:
$url = "http://localhost/upload_output.php";
$post_data = array ("foo" => "bar",
// файл для загрузки
"upload" => "@/tmp/desert.jpg");
$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 запроса, поставив вначале «@». Результат работы скрипта: Array
( => Array
( => desert.jpg
=> application/octet-stream
=> /tmp/phpAhEvXy
=> 0
=> 845941))
Одна из продвинутых возможностей cURL в PHP — это возможность выполнения нескольких запросов одновременно и асинхронно. В обычных условиях скрипт останавливается и ждет выполнения запроса. И если вам надо выполнить много запросов, то это может занять много времени, т.к. вы будете выполнять последовательно. Это ограничение можно обойти:
// создаем обработчики
$ch1 = curl_init();
$ch2 = curl_init();
// устанавливаем опции
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);
//create the multiple cURL handle
$mh = curl_multi_init();
// добавляем обработчики
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running = null;
// выполняем запросы
do {
curl_multi_exec($mh, $running);
} while ($running > 0);
// освободим ресурсы
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
Идея состоит в том, что вы можете создать множество cURL дескрипторов, объединить их под одним мульти-дескриптором и выполнять их асинхронно. Сначала все как и с обычным cURL запросом — создается дескриптор (curl_init()
), задаются параметры (curl_setopt()
). Далее создается мульти-дескриптор (curl_multi_init()
) и добавляются ранее созданные обычные дескрипторы (curl_multi_add_handle()
). Вместо обычного вызова curl_exec() мы будем многократно вызывать curl_multi_exec()
данная функция информирует нас о количестве активных соединений с помощью второго параметра — $running. Поэтому цикл работает пока $running не станет равным 0. И, конечно, после окончания работы необходимо освободить ресурсы. В данном примере мы просто выводим результат запросов в STDOUT. Рассмотрим нетривиальный случай применения multi cURL. Представьте себе блог с большим количеством постов, содержащих ссылки на внешние сайты. Некоторые из этих ссылок могут быть не рабочими. Напишем скрипт, который найдет все нерабочие ссылки и покажет их нам. Для начала нам необходимо вытащить все внешние ссылки из базы данных:
// CONFIG
$db_host = "localhost";
$db_user = "root";
$db_pass = "";
$db_name = "wordpress";
$excluded_domains = array("localhost", "сайт");
$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 (isset($tmp["host"]) && 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");
}
В этой части скрипта мы просто вытаскиваем из базы все внешние ссылки. Проверим их:
$mh = curl_multi_init();
// 1. добавим ссылки
for ($i = 0; $i < $max_connections; $i++) {
add_url_to_multi_handle($mh, $url_list);
}
// основной цикл
do {
curl_multi_exec($mh, $curRunning);
// 2. один из потоков завершил работу
if ($curRunning != $running) {
$mhinfo = curl_multi_info_read($mh);
if (is_array($mhinfo) && ($ch = $mhinfo["handle"])) {
// 3. один из запросов выполнен, можно получить информацию о нем
$info = curl_getinfo($ch);
// 4. нерабочая ссылка
if (!$info["http_code"]) {
$dead_urls = $info["url"];
// 5. 404?
} else if ($info["http_code"] == 404) {
$not_found_urls = $info["url"];
// 6. верная ссылка
} else {
$working_urls = $info["url"];
}
// 7. удаляем отработавший дескриптор
curl_multi_remove_handle($mh, $mhinfo["handle"]);
curl_close($mhinfo["handle"]);
// 8. добавим новый урл
add_url_to_multi_handle($mh, $url_list);
$running = $curRunning;
}
}
} while ($curRunning > 0);
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);
echo "\n\n";
// 9. добавляет дескриптор с заданным урлом
function add_url_to_multi_handle($mh, $url_list) {
static $index = 0;
// если еще есть ссылки
if (isset($url_list[$index])) {
// все как обычно
$ch = curl_init();
// устанавливаем опции
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);
$index++;
}
}
Рассмотрим код подробнее (нумерация соответствует комментариям в коде): Запустим скрипт: Dead URLs==
xample1234.com/
==404 URLs==
www.google.com/dsfasdfafd
==Working URLs==
ru.php.net/manual/ru/function.time.php
www.cssbuttongenerator.com/
csslint.net/
codex.wordpress.org/Plugin_API/Action_Reference
fortawesome.github.io/Font-Awesome/
fortawesome.github.io/Font-Awesome/
www.oracle.com/technetwork/java/javafx/downloads/index.html
codex.wordpress.org/Plugin_API/Filter_Reference
codex.wordpress.org/Roles_and_Capabilities
code.google.com/p/google-api-php-client/wiki/OAuth2#Google_APIs_Console
jplayer.org/
code.google.com/p/google-api-php-client/
developers.google.com/+/
accounts.google.com/ServiceLogin?service=devconsole&passive=1209600&continue=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F&followup=https%3A%2F%2Fcode.google.com%2Fapis%2Fconsole%2F
daneden.github.io/animate.css/
github.com/daneden/animate.css
ru2.php.net/manual/ru/function.autoload.php
www.google.com/recaptcha/api/verify
phpunit.de/
phpunit.de/manual/current/en/phpunit-book.html
Проверка заняла около 2 секунд. Запуская одновременно по 10 потоков производительность возрастает в 10 раз, по сравнению с обычными cURL запросами. Чтобы получить содержимое ответа сервера используйте функцию curl_multi_getcontent($ch)
, где $ch — дескриптор, полученный из curl_multi_info_read()
. Если 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 = "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"));
curl_setopt($ch, CURLOPT_FTPASCII, 1);
$output = curl_exec($ch);
curl_close($ch);
Запросы можно выполнять через определенный proxy:
$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);
Есть возможность использовать колбэки во время выполнения запроса, не дожидаясь его завершения. Например, во время того как ответ сервера загружается мы можем использовать уже полученные данные, не дожидаясь полной загрузки.
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"http://example.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 в PHP. В следующий раз, когда вам понадобится делать URL запросы — используйте cURL. Нам часто приходится загружать различные файлы из интернета, например, исполняемые файлы программ, файлы скриптов, архивы с исходниками. Но не всегда это нужно делать через браузер. Во многих ситуациях гораздо проще выполнить все действия через терминал. Поскольку таким образом вы можете автоматизировать процесс. С другой стороны, веб-мастерам время от времени приходится тестировать доступность веб-сайтов, проверять отправляемые и получаемые заголовки и многое другое. Для решения таких задач и задач подобного круга можно воспользоваться утилитой curl. Она позволяет решить намного более широкий круг задач, среди которых даже имитация действий пользователя на сайте. В этой статье мы рассмотрим как пользоваться curl, что это такое и зачем нужна эта программа. На самом деле, curl - это больше чем просто утилита командной строки для Linux или Windows. Это набор библиотек, в которых реализуются базовые возможности работы с URL страницами и передачи файлов. Библиотека поддерживает работу с протоколами: FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, LDAP, а также POP3, IMAP и SMTP. Она отлично подходит для имитации действий пользователя на страницах и других операций с URL адресами. Поддержка библиотеки curl была добавлена в множество различных языков программирования и платформ. Утилита curl - это независимая обвертка для этой библиотеки. Именно на этой утилите мы и остановимся в этой статье. Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Синтаксис утилиты очень прост: $ curl
опции
ссылка
Теперь рассмотрим основные опции: Это далеко не все параметры curl linux, но здесь перечислено все основное, что вам придется использовать. Мы рассмотрели все, что касается теории работы с утилитой 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. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -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 чтобы страница возвращалась только если она была изменена: Если на сервере требуется аутентификация одного из распространенных типов, например, 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 больше подходит для загрузки файлов и краулинга сайтов. В этой статье речь пойдет о таком мощном инструменте как cURL, а также о библиотеке для php, которая предоставляет доступ к этому инструменту — libcurl. Для чего все это нужно? Для связи с сервером по протоколам передачи данных, например, http или ftp. Остальные протоколы нам не особо интересны, если кто-то хочет углубляться в эту тему, то придется уже копать англоязычные ресурсы, а в этой статье будут основы и примеры использования. Итак, библиотека libcurl предоставляет нам возможность передачи данных на сервер, и получения ответов от него. Что нам это дает? Возможность эмуляции поведения пользователя или ! Вы можете получать содержимое страниц для последующего парсинга, можете получать заголовки ответов сервиса и программно авторизироваться на сайтах, делать скрипты постинга сообщений (например, в твиттер или на форумах) или информации. Все ограничивается лишь вашей фантазией! Первое, что мы должны сделать, это установить библиотеку. На локальном компьютере я пользуюсь сборкой Denwer, как и подавляющее большинство начинающих вебмастеров, на которых и рассчитана статья. Опытные пользователи, которые самостоятельно устанавливают связку php+apache+mysql смогут установить и cURL, не мне объяснять им как это делается;) А мы, новички, пользуемся готовыми решениями, чтобы было проще. Поэтому, устанавливаем libcurl следующим образом: и убираем точку с запятой в начале сроки:
;extension=php_curl.dll Готово. Чтобы проверить работоспособность библиотеки можете вызвать функцию phpinfo() и найти там строчку: cURL support enabled. Поздравляю с первой победой. Для началом работы с инструментом, его нужно инициализировать. Делается это следующим образом:
$ch = curl_init();
Мы использовали функцию инициализации сессии cURL. При этом, можно задать URL сразу, вот так:
$ch = curl_init("https://сайт");
А можно сделать это потом, в опциях. Порядок установки опций не имеет значения. Делается это другой функцией: Curl_setopt (resource ch, string option, mixed value)
Первый параметр этой функции, то есть resource ch мы уже создали чуть выше, а вот параметров option и value очень много. Я думаю, что не стоит копипастить сюда их все, а достаточно лишь дать ссылку на подробное описание функции, надеюсь никто не обидится: curl_setopt . Приведу пример установки опций как раз на примере URL:
$url = "https://сайт";
curl_setopt($ch, CURLOPT_URL,$url);
Еще парочка примеров задания опций: давайте получим заголовок ответа сервера, при этом не будем получать саму страницу: Curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок
curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
Итак, мы инициализировали сессию, задали нужные нам параметры, теперь выполняем получившийся запрос, закрываем сессию и выводим результат:
$result = curl_exec($ch);
curl_close($ch);
echo $result;
В итоге получаем наш первый полностью рабочий пример использования библиотеки libcurl:
$ch = curl_init();
$url = "https://сайт";
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок
curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
$result = curl_exec($ch);
curl_close($ch);
echo $result;
Как оно работает, надеюсь, понятно, ведь мы рассмотрели каждый шаг по отдельности:) В результате мы получаем заголовок HTTP ответа от сервера, который чуть ниже обязательно разберем, чтобы лучше понимать все этапы взаимодействия браузера и сервера: HTTP/1.1 200 OK
Server: nginx/1.2..php 1
Великолепно! Мы получили заголовок ответа от сервера и опробовали библиотеку в действии. Чем это нам полезно? Тем, что теперь вы примерно представляете себе последовательность действий при работе с cURL: Для примера я обратился к странице ya.ru и в просмотрел сформированный запрос браузера и полученный от сервера ответ. Вот и они: Я считаю, что после того, как некоторые общие моменты уже ясны и вроде бы все понятно, то самое время переходить к практике и на примере уже оттачивать свое мастерство. Лично у меня всегда сразу руки чешутся все попробовать на практике:) Раз уж cURL так хорош для парсеров, то рассмотрим функцию получения кода страницы по ее адресу. При этом на выходе получим массив с заголовком, содержимым страницы и даже коды ошибок, если что-то пойдет не так. Function get_web_page($url)
{
$uagent = "Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращает веб-страницу
curl_setopt($ch, CURLOPT_HEADER, 0); // не возвращает заголовки
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // переходит по редиректам
curl_setopt($ch, CURLOPT_ENCODING, ""); // обрабатывает все кодировки
curl_setopt($ch, CURLOPT_USERAGENT, $uagent); // useragent
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120); // таймаут соединения
curl_setopt($ch, CURLOPT_TIMEOUT, 120); // таймаут ответа
curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // останавливаться после 10-ого редиректа
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch);
$header = curl_getinfo($ch);
curl_close($ch);
$header["errno"] = $err;
$header["errmsg"] = $errmsg;
$header["content"] = $content;
return $header;
}
Входные параметры: Используем функцию, например, так:
$result = get_web_page("https://ya.ru");
if (($result["errno"] != 0)||($result["http_code"] != 200))
{
echo $result["errmsg"];
}
else
{
$page = $result["content"];
echo $page;
}
Все должно пройти без ошибок и вы получите код страницы в переменной $page
. Если же попробовать получить несуществующую страницу yaaaaaaaaaaaa.ru, то получим ошибку: Could not resolve host: yaaaaaaaaaaaa.ru; Host not found
Все обрабатывается корректно и красиво:) У Вас в браузере заблокирован JavaScript. Разрешите JavaScript для работы сайта! PHP поддерживает libcurl, библиотеку, созданную Daniel"ом Stenberg"ом,
которая даёт возможность соединяться с серверами различных типов и по разным протоколам. Эти функции были введены в PHP 4.0.2. curl_init - инициализирует CURL-сессию. resource curl_init
() Функция curl_init()
инициализирует новую сессию и возвратит CURL-дескриптор для
использования в функциях ,
и .
Если необязательный параметр url
предоставлен, то опция
CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции
. curl_setopt - устанавливает опции для CURL-трансфера/transfer. bool curl_setopt
(resource ch, string option, mixed value) Функция curl_setopt()
устанавливает опции для CURL-сессии, идентифицируемой параметром ch
.
Параметр option
является опцией, которую вы хотите установить, а value
это значение опции
option
. Параметр value
должен быть long для следующих опций (специфицированных параметром option
): Параметр value
должен быть строкой для следующих значений параметра option
: Следующие опции ожидают дескриптора файла, который получается с помощью функции
fopen()
: Параметр value
long write_callback (resource ch, string data){ ... return strlen($data);}
option
: Параметр value
должен быть функцией следующего вида
string read_callback (resource ch, resource fd, long length){}
для следующих значений параметра option
: curl_exec - выполняет CURL-сессию. bool curl_exec
(resource ch) Эта функция должна вызываться после того, как вы инициализируете сессию CURL
и все опции этой сессии уже установлены. Её назначение в том, чтобы просто
выполнить предопределённую CURL-сессию (заданную в параметре ch
). curl_close - закрывает CURL-сессию. void curl_close
(resource ch) Эта функция закрывает сессию CURL и освобождает все ресурсы.
CURL-дескриптор ch
также удаляется. curl_errno - возвращает целое число, содержащее номер последней ошибки. Если Вам нужно будет отправить в POST запросе многомерный массив и файл, то вы столкнетесь с неразрешимой проблемой.
Если передавать в CURLOPT_POSTFIELDS многомерный массив, то второй уровень будет передан как строка "Array".
Если преобразовать с помощью http_build_query, то Вы не сможете передать файл. Ниже представлена функция кодирования двумерного массива с подгрузкой файлов для Curl,
которая будет работать как в старых версиях PHP 5.3, PHP 5.4, так и в PHP 5.6
/** преобразует многомерный массив в одномерный, используйя сложные индексы и заменяет @ в префиксе на CurlFile для испрользоания в Curl
* @param $inputArray
* @param string $inputKey
* @return array
$requestVars = array("id" => array(1, 2,"id"=>1234),
"name" => "log",
"logfile" => "@/tmp/test.log");
получим:
["id"]=> int(1)
["id"]=> int(2)
["id"]=> int(1234)
["name"]=> string(3) "log"
["logfile"]=> string(13) "/tmp/test.log" }
*/
function convertToStringArray($inputArray, $inputKey="") {
$resultArray=;
foreach ($inputArray as $key => $value) {
$tmpKey = (bool)$inputKey ? $inputKey."[$key]" : $key;
if (is_array($value)) {
$resultArray+=convertToStringArray($value, $tmpKey);
} elseif ($value == "@"){
$resultArray[$tmpKey] = (class_exists(" CURLFile ", false)) ? new CurlFile(ltrim($value, "@")) : $value;
} else {
$resultArray[$tmpKey] = $value;
}
}
return $resultArray;
}
// проверяем
$requestVars = array("id" => array(1, 2,"id"=>1234),
"name" => "log",
"logfile" => "@/tmp/test.log");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "сайт");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars));
$res = curl_exec($ch);
curl_close($ch);
Прикладные примеры использования Curl
$ch
=
curl_init
();
print_r($_POST);
print_r($_FILES);
*/
curl_setopt
($ch
,
CURLOPT_POST
,
1
);
curl_setopt
($ch
,
CURLOPT_POSTFIELDS
,
$data
);
?>
Примечания
Почему cURL?
Основы cUrl
// 1. инициализация
$ch = curl_init();
// 2. устанавливаем опции, включая урл
curl_setopt($ch, CURLOPT_URL, "http://www.google.com");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. выполнение запроса и получение ответа
$output = curl_exec($ch);
// 4. очистка ресурсов
curl_close($ch);
Отслеживание ошибок
Получение информации о запросе
Отслеживание редиректов, в зависимости от браузера
Отправляем POST запросы
Загрузка файлов
Multi cURL
Проверка внешних ссылок в WordPress
Другие возможности cURL в PHP
HTTP аутентификация
Загрузка по FTP
Использование прокси
Колбэки (callback functions)
Заключение
Команда curl
Как пользоваться curl?
Ограничение скорости
Передача файлов
Отправка данных POST
Передача и прием куки
Передача и анализ заголовков
Аутентификация curl
Использование прокси
Выводы
Что вообще такое cURL и libcurl? Общие моменты
Установка cURL на Denwer (Денвер). Как начать пользоваться libcurl?
Описание cURL и первые шаги
Структура заголовка HTTP запроса
Запрос
GET / HTTP/1.1
— Пытаемся получить страницу по адресу /, то есть главную, находящуюся в корне папки. Используем протокол версии 1.1.
User-Agent: Opera/9.80 (Windows NT 6.1; WOW64) Presto/2.12.388 Version/12.14
— Представляемся серверу, мы — браузер Опера.
Host: ya.ru
— Доменное имя запрашиваемого ресурса.
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/webp, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
— Список допустимых форматов ресурса.
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8
— Список поддерживаемых языков.
Accept-Encoding: gzip, deflate
— Поддерживаемые способы кодирования.
Cookie: yandexuid=ХХХХХ
— Куки, при необходимости.
Connection: Keep-Alive
— Просим не разрывать соединение и оставаться на связи.
Ответ
HTTP/1.1 200 Ok
— Получаем ответ с кодом 200, значит все ОК.
Server: nginx
— Сервер представился — это nginx.
Date: Sun, 10 Mar 2013 14:10:50 GMT
— Текущие дата и время на сервере.
Content-Type: text/html; charset=UTF-8
— Тип контента и кодировка.
Connection: close
— Сервер не хочет поддерживать с нами постоянного соединения, поэтому сразу же его закрывает. Для следующего запроса будет установлено новое соединение.
Cache-Control: no-cache,no-store,max-age=0,must-revalidate
— Управление кэшированием. В данном случае оно отключено.
Expires: Sun, 10 Mar 2013 14:10:50 GMT
— Дата предполагаемого истечения срока действия сессии. В нашем случае оно совпадает с временем открытия, так как сервер тут же его закрыл, сразу после обработки.
Last-Modified: Sun, 10 Mar 2013 14:10:50 GMT
— Время последней модификации.
Content-Encoding: gzip
— Способ кодирования информации.
Полный список всех параметров, которые можно встретить в заголовке HTTP запроса можно посмотреть на википедии .
Теперь вы примерно представляете как общаются между собой ваш браузер и web-сервер. Это очень полезно знать и понимать, ведь мы будем пытаться эмулировать действия браузера с помощью библиотеки libcurl. Идем дальше.Пример работы с библиотекой
url
— адрес страницы или сайта.
Значения выходных параметров (массив с тремя элементами):
header[‘errno’]
— если что-то пошло не так, то тут будет код ошибки.
header[‘errmsg’]
— здесь при этом будет текст ошибки.
header[‘content’]
— собственно сама страница\файл\картинка и т.д.
Дальше с кодом страницы можно делать все что угодно, например, парсить регулярками. Но это все в следующих уроках, а пока что остановимся на этом.Curl
libcurl в настоящее время поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap.
libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP (это можно сделать также РНР-расширением ftp),
загрузку на основе форм HTTP, прокси, куки и аутентификацию user+password.curl_init
Описание
curl_setopt
Описание
curl_exec
Описание
curl_close
Описание
curl_errno
Описание
Пример 1. Инициализация новой сессии CURL и получение web-страницы.
Пример 2. Использование модуля CURL РНР для получения example.com
Пример 3. Проверка доступности URL с помощью CURL РНР
Пример 4. Отделение заголовка от тела, полученного с помощью CURL РНР
Пример 5. Определение адреса перехода URL с помощью CURL РНР
the problem: curl_setopt($ch,FOLLOW_LOCATION,1);
the error: trouble with open_basedir and safe_mode
the solution: a function already developed by someone
the solution n 2: the same function, modifed, works great for me..
= $curl_max_loops)
{
$curl_loops = 0;
return FALSE;
}
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
list($header, $data) = explode("\n\n", $data, 2);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if ($http_code == 301 || $http_code == 302)
{
$matches = ;
preg_match("/Location:(.*?)\n/", $header, $matches);
$url = @parse_url(trim(array_pop($matches)));
if (!$url)
{
//couldn"t process the url to redirect to
$curl_loops = 0;
return $data;
}
$last_url = parse_url(curl_getinfo($ch, CURLINFO_EFFECTIVE_URL));
if (!$url["scheme"])
$url["scheme"] = $last_url["scheme"];
if (!$url["host"])
$url["host"] = $last_url["host"];
if (!$url["path"])
$url["path"] = $last_url["path"];
$new_url = $url["scheme"] . "://" . $url["host"] . $url["path"] . ($url["query"]?"?".$url["query"]:"");
curl_setopt($ch, CURLOPT_URL, $new_url);
debug("Redirecting to", $new_url);
return curl_redir_exec($ch);
} else {
$curl_loops=0;
return $data;
}
}
?>
just use this function without de FOLLOW_LOCATION and should work. the problem was that when you get to the line where you return the data if http_code was different than 301 oe 302, $data has obsolete information or none. so $debbbb does the job.
Пример 6. Разбор cookie из заголовка с помощью CURL РНР
Sometimes you can"t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE becoz of the server
php-settings(They say u may grab any files from server using these options). Here is the solution
1)Don"t use CURLOPT_FOLLOWLOCATION
2)Use curl_setopt($ch, CURLOPT_HEADER, 1)
3)Grab from the header cookies like this:
preg_match_all("|Set-Cookie: (.*);|U", $content, $results);
$cookies = implode(";", $results);
4)Set them using curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Пример 7. Разбор cookie из заголовка с помощью CURL РНР
As Yevgen mentioned earlier sometimes we can"t use CURLOPT_COOKIEJAR and CURLOPT_COOKIEFILE. Below is a header callback function I wrote back in
January that lets you maintain cookies between cURL requests. Cookies are added to $ch during all requests even during redirection,
so you can use it together with CURLOPT_FOLLOWLOCATION.
Here is the code:
function read_header($ch, $string)
{
global $location; #keep track of location/redirects
global $cookiearr; #store cookies here
global $ch;
# ^overrides the function param $ch
# this is okay because we need to
# update the global $ch with
# new cookies
$length = strlen($string);
if(!strncmp($string, "Location:", 9))
{ #keep track of last redirect
$location = trim(substr($string, 9, -1));
}
if(!strncmp($string, "Set-Cookie:", 11))
{ #get the cookie
$cookiestr = trim(substr($string, 11, -1));
$cookie = explode(";", $cookiestr);
$cookie = explode("=", $cookie);
$cookiename = trim(array_shift($cookie));
$cookiearr[$cookiename] = trim(implode("=", $cookie));
}
$cookie = "";
if(trim($string) == "")
{ #execute only at end of header
foreach ($cookiearr as $key=>$value)
{
$cookie .= "$key=$value; ";
}
curl_setopt($ch, CURLOPT_COOKIE, $cookie);
}
return $length;
}
curl_setopt($ch, CURLOPT_HEADERFUNCTION, "read_header");
This code assumes that you will reuse $ch without initializing it every time (call curl_init only once, in the beginning).
If you need to initialize $ch again at any point in your code you can access the currently stored cookies in $cookiearr and include them in the new $ch.
I wrote this function before I had enough experience with regular expressions so you won"t find any preg_match calls here.
I have used this code for quite a while and without any problems accessing gmail, yahoo, hotmail, aol etc.
where I had to go through login and a few pages before getting to what I was looking for.
Пример 8. Установка обработчика загрузки заголовка с помощью CURL РНР
Using cURL, I needed to call a third-party script which was returning binary data as attachment to pass on retrieved data again as attachment.
Problem was that the third-party script occassionally returned HTTP errors and I wanted to avoid passing on zero-length attachment in such case.
Combination of using CURLOPT_FAILONERROR and CURLOPT_HEADERFUNCTION callback helped to process the third-party script HTTP errors neatly:
function curlHeaderCallback($resURL, $strHeader) {
if (preg_match("/^HTTP/i", $strHeader)) {
header($strHeader);
header("Content-Disposition: attachment; filename="file-name.zip"");
}
return strlen($strHeader);
}
$resURL = curl_init("http://сайт/");
curl_setopt($resURL, CURLOPT_BINARYTRANSFER, 1);
curl_setopt($resURL, CURLOPT_HEADERFUNCTION, "curlHeaderCallback");
curl_setopt($resURL, CURLOPT_FAILONERROR, 1);
curl_exec ($resURL);
$intReturnCode = curl_getinfo($resURL, CURLINFO_HTTP_CODE);
curl_close ($resURL);
if ($intReturnCode != 200) {
print "Ошибка с кодом: " . $intReturnCode;
}
Пример 9. Сохранение страницы в файл с подсчетом скорости передачи с помощью CURL РНР
WritePageToFile("http://es.php.net", "es.php.net.txt");
function WritePageToFile($sHTMLpage, $sTxtfile) {
$sh = curl_init($sHTMLpage);
$hFile = FOpen($sTxtfile, "w");
curl_setopt($sh, CURLOPT_FILE, $hFile);
curl_setopt($sh, CURLOPT_HEADER, 0);
curl_exec ($sh);
$sAverageSpeedDownload = curl_getInfo($sh, CURLINFO_SPEED_DOWNLOAD);
$sAverageSpeedUpload = curl_getInfo($sh, CURLINFO_SPEED_UPLOAD);
echo "";
echo "Average speed download == " . $sAverageSpeedDownload . "
";
curl_close($sh);
FClose ($hFile);
echo "(See the file "".$sTxtfile."" in the same path of the hosting".
" to where this script PHP).
";
echo "Average Speed upload == " . $sAverageSpeedUpload . "
";
echo "
";
$aCURLinfo = curl_getInfo($sh);
print_r($aCURLinfo);
echo "
";
}
Пример 9. Получение страницы через SSL соединение (https)
$ch=curl_init("https://сайт");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// Отключить ошибку "SSL certificate problem, verify that the CA cert is OK"
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
// Отключить ошибку "SSL: certificate subject name "hostname.ru" does not match target host name "123.123""
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
$out=curl_exec($ch);
//$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
//echo "http_code=".$http_code,", err=".curl_error($ch);
curl_close($ch);
Пример 10. Использование сессий и cookie в curl
$cookie_filename=sys_get_temp_dir()+"/cookie.tmp";
$curl=curl_init("http://сайт");
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie_filename);//сохранять полученные COOKIE в файл
curl_setopt($curl, CURLOPT_COOKIEFILE, $cookie_filename); //отсылаем серверу COOKIE полученные от него при авторизации
$out=curl_exec($curl);
Пример 11. Отправка файла и многомерный массив в Curl. CURLOPT_POSTFIELDS + CurlFile