Войти через VK Войти через FB Войти через Google Войти через Яндекс
Поиск по сайту
Curl
PHP поддерживает libcurl, библиотеку, созданную Daniel"ом Stenberg"ом,
которая даёт возможность соединяться с серверами различных типов и по разным протоколам.
libcurl в настоящее время поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap.
libcurl также поддерживает сертификаты HTTPS, HTTP POST, HTTP PUT, загрузку по FTP (это можно сделать также РНР-расширением ftp),
загрузку на основе форм HTTP, прокси, куки и аутентификацию user+password.
Эти функции были введены в PHP 4.0.2.
curl_init
curl_init - инициализирует CURL-сессию.
Описание
resource curl_init([string url])
Функция curl_init() инициализирует новую сессию и возвратит CURL-дескриптор для
использования в функциях curl_setopt(),
curl_exec() и curl_close().
Если необязательный параметр url
предоставлен, то опция
CURLOPT_URL получит значение этого параметра. Вы можете вручную устанавливать его с помощью функции
curl_setopt().
curl_setopt
curl_setopt - устанавливает опции для CURL-трансфера/transfer.
Описание
bool curl_setopt (resource ch, string option, mixed value)
Функция curl_setopt() устанавливает опции для CURL-сессии, идентифицируемой параметром ch
.
Параметр option
является опцией, которую вы хотите установить, а value
это значение опции
option
.
Параметр value
должен быть long для следующих опций (специфицированных параметром option
):
- CURLOPT_INFILESIZE: Если вы выгружаете файл на удалённый сайт, эта опция должна использоваться, для того чтобы сообщит PHP, какой будет ожидаемый размер infile.
- CURLOPT_VERBOSE: Установите эту опцию в ненулевое значение, если вы хотите, чтобы CURL сообщала обо всех действиях.
- CURLOPT_HEADER: Установите эту опцию в ненулевое значение, если вы хотите, чтобы шапка/header включалась в вывод.
- CURLOPT_NOPROGRESS: Установите эту опцию в ненулевое значение, если вы не хотите, чтобы PHP выводил индикатор процесса CURL-трансфера. (PHP автоматически устанавливает эту опцию в ненулевое значение, изменять её необходимо лишь при отладке.)
- CURLOPT_NOBODY: Установите эту опцию в ненулевое значение, если вы не хотите, чтобы тело/body включалось в вывод.
- CURLOPT_FAILONERROR: Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP завершал работу скрыто, если возвращаемый HTTP-код имеет значение выше 300. По умолчанию страница возвращается нормально с игнорированием кода.
- CURLOPT_UPLOAD: Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP подготавливал файл к выгрузке.
- CURLOPT_POST: Установите эту опцию в ненулевое значение, если вы хотите, чтобы PHP выполнял
регулярный HTTP POST. Этот POST имеет нормальный вид
application/x-www-form-urlencoded
, чаще всего используемый HTML-формами. - CURLOPT_FTPLISTONLY: Установите эту опцию в ненулевое значение, и PHP будет выводит листинг имён FTP-директории.
- CURLOPT_FTPAPPEND: Установите эту опцию в ненулевое значение, и PHP будет присоединять к удалённому/remote файлу, вместо его перезаписи.
- CURLOPT_NETRC: Установите эту опцию в ненулевое значение, и PHP будет сканировать ваш файл
~./netrc
с целью поиска ваших username и password для удалённого сайта, с которым вы устанавливаете соединение. - CURLOPT_FOLLOWLOCATION: Установите эту опцию в ненулевое значение, чтобы следовать любому "Location: " header, который сервер высылает как часть HTTP header"а (заметьте, что это рекурсия, PHP будет следовать за всеми "Location: "-header"ами, которые высылаются.)
- CURLOPT_PUT: Установите эту опцию в ненулевое значение, чтобы HTTP PUT файл. Файл для PUT обязан быть установлен с помощью CURLOPT_INFILE и CURLOPT_INFILESIZE.
- CURLOPT_MUTE: Установите эту опцию в ненулевое значение, и PHP будет работать скрыто в отношении CURL-функций.
- CURLOPT_TIMEOUT: Передаёт long как параметр, который содержит максимальное время в секундах, которое вы отводите для работы CURL-функций.
- CURLOPT_CONNECTTIMEOUT: Передаёт long как параметр, который содержит максимальное время в секундах, которое вы отводите для ожидания при попытке подключения. Используйте 0 чтобы ждать бесконечно.
- CURLOPT_LOW_SPEED_LIMIT: Передаёт long как параметр, который содержит скорость трансфера в байтах в секунду, ниже которого трансфер должен работать в процессе выполнения CURLOPT_LOW_SPEED_TIME, в секундах, чтобы PHP считал его слишком медленным и прерывал его.
- CURLOPT_LOW_SPEED_TIME: Передаёт long как параметр, который содержит время в секундах, ниже которого трансфер должен работать в процессе выполнения CURLOPT_LOW_SPEED_LIMIT, чтобы PHP считал его слишком медленным и прерывал его.
- CURLOPT_RESUME_FROM: Передаёт long как параметр, который содержит смещение в байтах, с которого трансфер должен стартовать.
- CURLOPT_SSLVERSION: Передаёт long как параметр, который содержит используемую версию SSL (2 или 3). По умолчанию PHP пытается определить это сам, хотя в некоторых случаях вы обязаны устанавливать это вручную.
- CURLOPT_SSL_VERIFYHOST: Передаёт long, если CURL должна проверять Common-имя peer-сертификата в SSL handshake/"рукопожатие". Значение 1 указывает, что мы должны проверить существование общего /common имени, значение 2 указывает, что мы должны убедиться в совпадении с предоставленным hostname.
- CURLOPT_TIMECONDITION: Передаёт long как параметр, который определяет, как рассматривается CURLOPT_TIMEVALUE. Вы можете установить этот параметр для TIMECOND_IFMODSINCE или TIMECOND_ISUNMODSINCE. Это действует только для HTTP.
- CURLOPT_TIMEVALUE: Передаёт long как параметр, который является временем в секундах, прошедшим после 1 января 1970. Это время используется, как специфицировано опцией CURLOPT_TIMEVALUE, или по умолчанию будет использоваться TIMECOND_IFMODSINCE.
- CURLOPT_RETURNTRANSFER: Передаёт ненулевое значение, если вы хотите, чтобы CURL непосредственно возвращала полученную информацию, вместо её печати напрямую.
Параметр value
должен быть строкой для следующих значений параметра option
:
- CURLOPT_URL: Это URL, который PHP должен получать. Вы можете также устанавливать эту опцию при инициализации сессии функцией curl_init().
- CURLOPT_USERPWD: Передаёт в РНР строку, отформатированную в виде [username]:[password], для использования при соединении.
- CURLOPT_PROXYUSERPWD: Передаёт в РНР строку, отформатированную в виде [username]:[password], для соединения с HTTP-прокси.
- CURLOPT_RANGE: Передаёт специфицированный вами диапазон. Он должен быть в формате "X-Y", где X или Y могут отсутствовать. HTTP-трансферы поддерживают также различные интервалы, разделённые запятыми, как, например, X-Y,N-M.
- CURLOPT_POSTFIELDS: Передаёт строку, содержащую полные данные для передачи операцией HTTP "POST".
- CURLOPT_REFERER: Передаёт строку, содержащую "referer/ссылающийся" header, используемый в HTTP-запросе.
- CURLOPT_USERAGENT: Передаёт строку, содержащую "user-agent" header, используемый в HTTP-запросе.
- CURLOPT_FTPPORT: Передаёт строку, содержащую значение, которое будет использоваться для получения IP-адреса для инструкции ftp "POST". POST-инструкция указывает удалённому серверу: соединиться со специфицированным IP-адресом. Строка может быть обычным IP-адресом, hostname/именем хоста, именем сетевого интерфейса (под UNIX), или просто обычным "-", используемым для системного IP-адреса по умолчанию.
- CURLOPT_COOKIE: Передаёт строку с содержимым куки/cookie, установленным в HTTP header"е.
- CURLOPT_SSLCERT: Передаёт строку, содержащую filename форматированного сертификата PEM.
- CURLOPT_SSLCERTPASSWD: Передаёт строку, содержащую password, необходимый для работы сертификата CURLOPT_SSLCERT.
- CURLOPT_COOKIEFILE: Передаёт строку, содержащую имя файла с данными куки. Этот cookie-файл может иметь формат Netscape, или содержать обычные шапки/headers в HTTP-стиле, забитые в файл.
- CURLOPT_CUSTOMREQUEST: Передаёт строку, используемую вместо
GET
илиHEAD
при выполнении HTTP-запроса. Это делается для выполненияDELETE
или других, более скрытых HTTP-запросов. Верными значениями являютсяGET
,POST
и так далее; то есть не вводите здесь полную строку HTTP-запроса. Например, ввод "GET /index.html HTTP/1.0" будет некорректным. (не делайте это, если не уверены, что ваш сервер поддерживает эту команду.) - CURLOPT_PROXY: Передаёт имя HTTP-прокси туннельным запросам.
- CURLOPT_INTERFACE: Передаёт имя исходящего сетевого интерфейса для использования. Это может быть имя интерфейса, IP-адрес или имя хоста. ( curl_setopt($ch, CURLOPT_INTERFACE, $extip) )
- CURLOPT_KRB4LEVEL: Передаёт KRB4 (Kerberos
4) уровень секретности. Это любая из следующих строк (в порядке от менее до более мощной): "clear", "safe",
"confidential", "private".
Если эта строка не совпадает с какой-либо из указанных, то используется "private". Если вы установите здесь NULL, это отключит KRB4-безопасность. KRB4-безопасность работает в настоящее время только с транзакциями FTP. - CURLOPT_HTTPHEADER: Передаёт массив полей HTTP-header"а для установки.
- CURLOPT_QUOTE: Передаёт массив FTP-команд для выполнения на сервере до выполнения FTP-запроса.
- CURLOPT_POSTQUOTE: Передаёт массив FTP-команд для выполнения на сервере после выполнения FTP-запроса.
Следующие опции ожидают дескриптора файла, который получается с помощью функции fopen():
- CURLOPT_FILE: Файл, куда должен быть помещён вывод вашего трансфера, по умолчанию это STDOUT.
- CURLOPT_INFILE: Файл, из которого приходит ввод вашего трансфера.
- CURLOPT_WRITEHEADER: Файл для записи header-части вывода.
- CURLOPT_STDERR: Файл для записи ошибок, вместо stderr.
Параметр value
должен быть функцией следующего вида
long write_callback (resource ch, string data){ ... return strlen($data);}
для следующих значений параметра option
:
- CURLOPT_WRITEFUNCTION: .
- CURLOPT_HEADERFUNCTION: .
Параметр value
должен быть функцией следующего вида
string read_callback (resource ch, resource fd, long length){}
для следующих значений параметра option
:
- CURLOPT_READFUNCTION: .
curl_exec
curl_exec - выполняет CURL-сессию.
Описание
bool curl_exec (resource ch)
Эта функция должна вызываться после того, как вы инициализируете сессию CURL
и все опции этой сессии уже установлены. Её назначение в том, чтобы просто
выполнить предопределённую CURL-сессию (заданную в параметре ch
).
curl_close
curl_close - закрывает CURL-сессию.
Описание
void curl_close ( resource ch)
Эта функция закрывает сессию CURL и освобождает все ресурсы.
CURL-дескриптор ch
также удаляется.
curl_errno
curl_errno - возвращает целое число, содержащее номер последней ошибки.
Описание
int curl_errno ( resource ch)
curl_error
curl_error - возвращает строку содержащую номер последней ошибки для текущей сессии.
Описание
string curl_error (resource ch)
curl_getinfo
curl_getinfo - получает информацию, касающуюся специфической передачи/transfer.
Описание
string curl_getinfo (resource ch, int opt)
Возвращает информацию о последней операции, opt
может быть одной из следующих констант:
-
CURLINFO_EFFECTIVE_URL
- Последний использованный URL -
CURLINFO_HTTP_CODE
- Последний полученный код HTTP -
CURLINFO_FILETIME
- Дата модификации загруженного документа, если она неизвестна, возвращается -1. -
CURLINFO_TOTAL_TIME
- Полное время выполнения операции в секундах. -
CURLINFO_NAMELOOKUP_TIME
- Время разрешения имени сервера в секундах. -
CURLINFO_CONNECT_TIME
- Время, затраченное на установку соединения, в секундах -
CURLINFO_PRETRANSFER_TIME
- Время, прошедшее от начала операции до готовности к фактической передаче данных, в секундах -
CURLINFO_STARTTRANSFER_TIME
- Время, прошедшее от начала операции до момента передачи первого байта данных, в секундах -
CURLINFO_REDIRECT_TIME
- Общее время, затраченное на перенапрвления, в секундах -
CURLINFO_SIZE_UPLOAD
- Количество байт при закачке -
CURLINFO_SIZE_DOWNLOAD
- Количество байт при загрузке -
CURLINFO_SPEED_DOWNLOAD
- Средняя скорость закачки -
CURLINFO_SPEED_UPLOAD
- Средняя скорость загрузки -
CURLINFO_HEADER_SIZE
- Суммарный размер всех полученных заголовков -
CURLINFO_REQUEST_SIZE
- Суммарный размер всех отправленных запросов, в настоящее время используется только для HTTP запросов -
CURLINFO_SSL_VERIFYRESULT
- Результат проверки SSL сертификата, запрошенной с помощью установки параметра CURLOPT_SSL_VERIFYPEER -
CURLINFO_CONTENT_LENGTH_DOWNLOAD
- размер загруженного документа, прочитанный из заголовка Content-Length -
CURLINFO_CONTENT_LENGTH_UPLOAD
- Размер закачиваемых данных -
CURLINFO_CONTENT_TYPE
- Содержимое полученного заголовка Content-type, или NULL в случае, когда этот заголовок не был получен
При вызове без необязательного аргумента opt
возвращается ассоциативный массив со следующими индексами, которые
соответствуют значениям аргумента opt
:
- "url"
- "content_type"
- "http_code"
- "header_size"
- "request_size"
- "filetime"
- "ssl_verify_result"
- "redirect_count"
- "total_time"
- "namelookup_time"
- "connect_time"
- "pretransfer_time"
- "size_upload"
- "size_download"
- "speed_download"
- "speed_upload"
- "download_content_length"
- "upload_content_length"
- "starttransfer_time"
- "redirect_time"
Пример использования curl_getinfo:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLINFO_HEADER_OUT, true); // если этот параметр не указать не работает!
curl_exec($ch);
var_dump(curl_getinfo($ch,CURLINFO_HEADER_OUT));
Пример использования curl_getinfo:
$ch = curl_init(); // create cURL handle (ch)
if (!$ch) {
die("Couldn't initialize a cURL handle");
}
// set some cURL options
$ret = curl_setopt($ch, CURLOPT_URL, "http://mail.yahoo.com");
$ret = curl_setopt($ch, CURLOPT_HEADER, 1);
$ret = curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
$ret = curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0);
$ret = curl_setopt($ch, CURLOPT_TIMEOUT, 30);
// execute
$ret = curl_exec($ch);
if (empty($ret)) {
// some kind of an error happened
die(curl_error($ch));
curl_close($ch); // close cURL handler
} else {
$info = curl_getinfo($ch);
curl_close($ch); // close cURL handler
if (empty($info['http_code'])) {
die("No HTTP code was returned");
} else {
// load the HTTP codes
$http_codes = parse_ini_file("path/to/the/ini/file/I/pasted/above");
// echo results
echo "The server responded: <br />";
echo $info['http_code'] . " " . $http_codes[$info['http_code']];
}
}
curl_version
curl_version - возвращает версию текущей CURL.
Описание
string curl_version (void)
Функция curl_version() возвращает строку с текущей версией CURL.
curl_version=Array
(
[version_number] => 472065
[age] => 3
[features] => 4179869
[ssl_version_number] => 0
[version] => 7.52.1
[host] => x86_64-pc-linux-gnu
[ssl_version] => OpenSSL/1.0.2u
[libz_version] => 1.2.8
[protocols] => Array
(
[0] => dict
[1] => file
[2] => ftp
[3] => ftps
[4] => gopher
[5] => http
[6] => https
[7] => imap
[8] => imaps
[9] => ldap
[10] => ldaps
[11] => pop3
[12] => pop3s
[13] => rtmp
[14] => rtsp
[15] => scp
[16] => sftp
[17] => smb
[18] => smbs
[19] => smtp
[20] => smtps
[21] => telnet
[22] => tftp
)
)
Предопределённые константы
Эти константы определены данным расширением и будут доступны только в том случае, если либо вкомпилированы в РНР, либо динамически загружены на этапе прогона.
CURLOPT_PORT
(integer)CURLOPT_FILE
(integer)CURLOPT_INFILE
(integer)CURLOPT_INFILESIZE
(integer)CURLOPT_URL
(integer)CURLOPT_PROXY
(integer)CURLOPT_VERBOSE
(integer)CURLOPT_HEADER
(integer)CURLOPT_HTTPHEADER
(integer)CURLOPT_NOPROGRESS
(integer)CURLOPT_NOBODY
(integer)CURLOPT_FAILONERROR
(integer)CURLOPT_UPLOAD
(integer)CURLOPT_POST
(integer)CURLOPT_FTPLISTONLY
(integer)CURLOPT_FTPAPPEND
(integer)CURLOPT_NETRC
(integer)CURLOPT_FOLLOWLOCATION
(integer)CURLOPT_FTPASCII
(integer)CURLOPT_PUT
(integer)CURLOPT_MUTE
(integer)CURLOPT_USERPWD
(integer)CURLOPT_PROXYUSERPWD
(integer)CURLOPT_RANGE
(integer)CURLOPT_TIMEOUT
(integer)CURLOPT_POSTFIELDS
(integer)CURLOPT_REFERER
(integer)CURLOPT_USERAGENT
(integer)CURLOPT_FTPPORT
(integer)CURLOPT_LOW_SPEED_LIMIT
(integer)CURLOPT_LOW_SPEED_TIME
(integer)CURLOPT_RESUME_FROM
(integer)CURLOPT_COOKIE
(integer)CURLOPT_SSLCERT
(integer)CURLOPT_SSLCERTPASSWD
(integer)CURLOPT_WRITEHEADER
(integer)CURLOPT_SSL_VERIFYHOST
(integer)CURLOPT_COOKIEFILE
(integer)CURLOPT_SSLVERSION
(integer)CURLOPT_TIMECONDITION
(integer)CURLOPT_TIMEVALUE
(integer)CURLOPT_CUSTOMREQUEST
(integer)CURLOPT_STDERR
(integer)CURLOPT_TRANSFERTEXT
(integer)CURLOPT_RETURNTRANSFER
(integer)CURLOPT_QUOTE
(integer)CURLOPT_POSTQUOTE
(integer)CURLOPT_INTERFACE
(integer)CURLOPT_KRB4LEVEL
(integer)CURLOPT_HTTPPROXYTUNNEL
(integer)CURLOPT_FILETIME
(integer)CURLOPT_WRITEFUNCTION
(integer)CURLOPT_READFUNCTION
(integer)CURLOPT_PASSWDFUNCTION
(integer)CURLOPT_HEADERFUNCTION
(integer)CURLOPT_MAXREDIRS
(integer)CURLOPT_MAXCONNECTS
(integer)CURLOPT_CLOSEPOLICY
(integer)CURLOPT_FRESH_CONNECT
(integer)CURLOPT_FORBID_REUSE
(integer)CURLOPT_RANDOM_FILE
(integer)CURLOPT_EGDSOCKET
(integer)CURLOPT_CONNECTTIMEOUT
(integer)CURLOPT_SSL_VERIFYPEER
(integer)CURLOPT_CAINFO
(integer)CURLOPT_COOKIEJAR
(integer)CURLOPT_SSL_CIPHER_LIST
(integer)CURLOPT_BINARYTRANSFER
(integer)CURLCLOSEPOLICY_LEAST_RECENTLY_USED
(integer)CURLCLOSEPOLICY_LEAST_TRAFFIC
(integer)CURLCLOSEPOLICY_SLOWEST
(integer)CURLCLOSEPOLICY_CALLBACK
(integer)CURLCLOSEPOLICY_OLDEST
(integer)CURLINFO_EFFECTIVE_URL
(integer)CURLINFO_HTTP_CODE
(integer)CURLINFO_HEADER_SIZE
(integer)CURLINFO_REQUEST_SIZE
(integer)CURLINFO_TOTAL_TIME
(integer)CURLINFO_NAMELOOKUP_TIME
(integer)CURLINFO_CONNECT_TIME
(integer)CURLINFO_PRETRANSFER_TIME
(integer)CURLINFO_SIZE_UPLOAD
(integer)CURLINFO_SIZE_DOWNLOAD
(integer)CURLINFO_SPEED_DOWNLOAD
(integer)CURLINFO_SPEED_UPLOAD
(integer)CURLINFO_FILETIME
(integer)CURLINFO_SSL_VERIFYRESULT
(integer)CURLINFO_CONTENT_LENGTH_DOWNLOAD
(integer)CURLINFO_CONTENT_LENGTH_UPLOAD
(integer)CURLE_OK
(integer)CURLE_UNSUPPORTED_PROTOCOL
(integer)CURLE_FAILED_INIT
(integer)CURLE_URL_MALFORMAT
(integer)CURLE_URL_MALFORMAT_USER
(integer)CURLE_COULDNT_RESOLVE_PROXY
(integer)CURLE_COULDNT_RESOLVE_HOST
(integer)CURLE_COULDNT_CONNECT
(integer)CURLE_FTP_WEIRD_SERVER_REPLY
(integer)CURLE_FTP_ACCESS_DENIED
(integer)CURLE_FTP_USER_PASSWORD_INCORRECT
(integer)CURLE_FTP_WEIRD_PASS_REPLY
(integer)CURLE_FTP_WEIRD_USER_REPLY
(integer)CURLE_FTP_WEIRD_PASV_REPLY
(integer)CURLE_FTP_WEIRD_227_FORMAT
(integer)CURLE_FTP_CANT_GET_HOST
(integer)CURLE_FTP_CANT_RECONNECT
(integer)CURLE_FTP_COULDNT_SET_BINARY
(integer)CURLE_PARTIAL_FILE
(integer)CURLE_FTP_COULDNT_RETR_FILE
(integer)CURLE_FTP_WRITE_ERROR
(integer)CURLE_FTP_QUOTE_ERROR
(integer)CURLE_HTTP_NOT_FOUND
(integer)CURLE_WRITE_ERROR
(integer)CURLE_MALFORMAT_USER
(integer)CURLE_FTP_COULDNT_STOR_FILE
(integer)CURLE_READ_ERROR
(integer)CURLE_OUT_OF_MEMORY
(integer)CURLE_OPERATION_TIMEOUTED
(integer)CURLE_FTP_COULDNT_SET_ASCII
(integer)CURLE_FTP_PORT_FAILED
(integer)CURLE_FTP_COULDNT_USE_REST
(integer)CURLE_FTP_COULDNT_GET_SIZE
(integer)CURLE_HTTP_RANGE_ERROR
(integer)CURLE_HTTP_POST_ERROR
(integer)CURLE_SSL_CONNECT_ERROR
(integer)CURLE_FTP_BAD_DOWNLOAD_RESUME
(integer)CURLE_FILE_COULDNT_READ_FILE
(integer)CURLE_LDAP_CANNOT_BIND
(integer)CURLE_LDAP_SEARCH_FAILED
(integer)CURLE_LIBRARY_NOT_FOUND
(integer)CURLE_FUNCTION_NOT_FOUND
(integer)CURLE_ABORTED_BY_CALLBACK
(integer)CURLE_BAD_FUNCTION_ARGUMENT
(integer)CURLE_BAD_CALLING_ORDER
(integer)CURLE_HTTP_PORT_FAILED
(integer)CURLE_BAD_PASSWORD_ENTERED
(integer)CURLE_TOO_MANY_REDIRECTS
(integer)CURLE_UNKNOWN_TELNET_OPTION
(integer)CURLE_TELNET_OPTION_SYNTAX
(integer)CURLE_OBSOLETE
(integer)CURLE_SSL_PEER_CERTIFICATE
(integer)
Примеры
После того как вы скомпилировали PHP с поддержкой CURL, вы можете начать использовать curl-функций. Основная идея функций CURL - вы инициализируете CURL-сессию с использованием curl_init(), затем можно установить все ваши опции для трансфера через использование curl_exec(), а затем закрыть сессию функцией curl_close().
Пример 1. Инициализация новой сессии CURL и получение web-страницы.
<?php
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch);
curl_close ($ch);
?>
Пример 2. Использование модуля CURL РНР для получения example.com
<?php
$ch = curl_init ("http://www.example.com/");
$fp = fopen ("example_homepage.txt", "w");
curl_setopt ($ch, CURLOPT_FILE, $fp);
curl_setopt ($ch, CURLOPT_HEADER, 0);
curl_exec ($ch);
curl_close ($ch);
fclose ($fp);
?>
Пример 3. Проверка доступности URL с помощью CURL РНР
<?php
function check_url($url) {
$c = curl_init();
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_HEADER, 1); // читать заголовок
curl_setopt($c, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_FRESH_CONNECT, 1); // не использовать cache
if (!curl_exec($c)) return false;
$httpcode = curl_getinfo($c, CURLINFO_HTTP_CODE);
return ($httpcode < 400);
}
?>
Пример 4. Отделение заголовка от тела, полученного с помощью CURL РНР
<?php
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($output, 0, $header_size - 4);
$body = substr($output, $header_size);
?>
Пример 5. Определение адреса перехода URL с помощью CURL РНР
Проблема: curl_setopt($ch,FOLLOW_LOCATION,1);
Ошибка: проблема с open_basedir и safe_mode
Решение: функция, уже разработанная кем-то
Решение № 2: та же функция, модифицированная, отлично работает у меня..
<?php
function curl_redir_exec($ch)
{
static $curl_loops = 0;
static $curl_max_loops = 20;
if ($curl_loops++ >= $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;
}
}
?>
Просто используйте эту функцию без de FOLLOW_LOCATION. Должно работать. Проблема заключалась в том, что когда вы добираетесь до строки, где вы возвращаете данные, если http_code отличается от 301 или 302, $data имеет устаревшую информацию или ее нет. так что $debbbb делает свою работу.
Пример 6. Разбор cookie из заголовка с помощью CURL РНР
Иногда вы не можете использовать CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE из-за сервера
php-settings (Говорят, что вы можете получить любые файлы с сервера, используя эти параметры). Вот решение
1) Не используйте CURLOPT_FOLLOWLOCATION
2) Используйте curl_setopt($ch, CURLOPT_HEADER
3) Возьмите из заголовка файлы cookie следующим образом:
preg_match_all('|Set-Cookie: (.*);|U', $content, $results);
$cookies = implode(';', $results[1]);
4)Установите их с помощью curl_setopt($ch, CURLOPT_COOKIE, $cookies);
Пример 7. Разбор cookie из заголовка с помощью CURL РНР
Как ранее упоминалось, иногда мы не можем использовать CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE. Ниже приведена функция обратного вызова заголовка, которая позволяет сохранять файлы cookie между запросами cURL. Куки добавляются в $ch во время всех запросов, даже при перенаправлении, поэтому вы можете использовать его вместе с CURLOPT_FOLLOWLOCATION. Вот код:
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[0]);
$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');
Этот код предполагает, что вы будете повторно использовать $ch без его инициализации каждый раз (вызовите curl_init только один раз в начале). Если вам нужно снова инициализировать $ch в любой момент вашего кода, вы можете получить доступ к текущим сохраненным файлам cookie в $cookiearr и включить их в новый $ch.
Я написал эту функцию до того, как у меня появилось достаточно опыта работы с регулярными выражениями, поэтому вы не найдете здесь никаких вызовов preg_match. Я использовал этот код довольно долгое время и без каких-либо проблем с доступом к gmail, yahoo, hotmail, aol и т. д. Где мне пришлось пройти через логин и несколько страниц, прежде чем я добрался до того, что искал.
Пример 8. Установка обработчика загрузки заголовка с помощью CURL РНР
Используя cURL, мне нужно было вызвать сторонний скрипт, который возвращал двоичные данные в качестве вложения, чтобы снова передать полученные данные в качестве вложения.
Проблема заключалась в том, что сторонний скрипт иногда возвращал ошибки HTTP, и я хотел избежать передачи вложения нулевой длины в таком случае.
Комбинация использования обратного вызова CURLOPT_FAILONERROR и CURLOPT_HEADERFUNCTION помогла аккуратно обработать HTTP-ошибки стороннего скрипта:
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://htmlweb.ru/');
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 '<pre>';
echo 'Average speed download == ' . $sAverageSpeedDownload . '<br>';
echo 'Average Speed upload == ' . $sAverageSpeedUpload . '<br>';
echo '<br>';
$aCURLinfo = curl_getInfo( $sh );
print_r( $aCURLinfo );
echo '</pre>';
curl_close( $sh );
FClose ( $hFile );
echo '(<b>See the file "'.$sTxtfile.'" in the same path of the hosting'.
' to where this script PHP</b>).<br>';
}
Пример 9. Получение страницы через SSL соединение (https)
$ch=curl_init('https://htmlweb.ru');
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://htmlweb.ru');
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
Если Вам нужно будет отправить в 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[0]"]=> int(1)
["id[1]"]=> int(2)
["id[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[0] == '@'){
$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, 'htmlweb.ru');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, convertToStringArray($requestVars));
$res = curl_exec($ch);
curl_close($ch);
Прикладные примеры использования Curl
Читать дальше: htaccess и PHP
.
Прокомментировать/Отблагодарить