25 янв. 2011 г.

Библиотека CURL в PHP

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_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: 
";
        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] => 462597
[age] => 2
[features] => 1597
[ssl_version_number] => 0
[version] => 7.15.5
[host] => x86_64-redhat-linux-gnu
[ssl_version] => OpenSSL/0.9.8b
[libz_version] => 1.2.3
[protocols] => Array
(
[0] => tftp
[1] => ftp
[2] => telnet
[3] => dict
[4] => ldap
[5] => http
[6] => file
[7] => https
[8] => ftps
)

)
1







Предопределённые константы

Эти константы определены данным расширением и будут доступны только в том
случае, если либо вкомпилированы в РНР, либо динамически загружены на этапе прогона.
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-страницы.


Пример 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 = array();
            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[1]);
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[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');


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);
}

$strURL = 'http://www.somesite.com/index.php';

$resURL = curl_init();
curl_setopt($resURL, CURLOPT_URL, $strURL);
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 РНР
vWritePageToFile( 'http://es.php.net', 'es.php.net.txt' );

    function vWritePageToFile( $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 . '
';
     echo 'Average Speed upload    == ' . $sAverageSpeedUpload   . '
';
     echo '
';
     $aCURLinfo = curl_getInfo( $sh );
     print_r( $aCURLinfo );
     echo '
'; curl_close( $sh ); FClose ( $hFile ); echo '(See the file "'.$sTxtfile.'" in the same path of the hosting'. ' to where this script PHP). '; }



Пример 9. Получение страницы через SSL соединение (https)

$ch=curl_init('https://perfectmoney.com/acct/balance.asp?AccountID='.$AccountID.'&PassPhrase='.urlencode($_GET['p']));curl_setopt($chCURLOPT_HEADER0);curl_setopt($chCURLOPT_RETURNTRANSFER1);// Отключить ошибку "SSL certificate problem, verify that the CA cert is OK"curl_setopt($chCURLOPT_SSL_VERIFYPEER0);// Отключить ошибку "SSL: certificate subject name 'hostname.ru' does not match target host name '123.123.123.123'"curl_setopt($chCURLOPT_SSL_VERIFYHOST0);$out=curl_exec($ch); 
    //$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    //echo "http_code=".$http_code,', err='.curl_error($ch);curl_close($ch);?>

Скопировать в буффер