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 для удалённого сайта, с которым вы устанавливаете соединение.
Параметр 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) для следующих значений параметра option:
- CURLOPT_WRITEFUNCTION: .
- CURLOPT_HEADERFUNCTION: .
Параметр value должен быть функцией следующего вида string read_callback (resource ch, resource fd, long length)<> для следующих значений параметра option:
(PHP 4 >= 4.0.2, PHP 5)
curl_setopt — Устанавливает параметр для сеанса CURL
Описание bool curl_setopt ( resource ch, string option, mixed value )
Функция curl_setopt() Устанавливает параметр для сеанса CURL, заданного аргументом ch . Аргумент option задает устанавливаемый параметр, а value — его значение.
Для перечисленных ниже параметров, value должен быть целым числом:
CURLOPT_INFILESIZE : при закачке файла на удаленный сервер, следует использовать этот параметр для указания ожидаемого размера файла.
CURLOPT_VERBOSE : При установке этого параметра в ненулевое значение cURL будет выводить подробные сообщения о всех производимых действиях.
CURLOPT_HEADER : При установке этого параметра в ненулевое значение результат будет включать полученные заголовки.
CURLOPT_NOPROGRESS : При установке этого параметра в ненулевое значение не будет выводиться индикатор прогресса операции.
Замечание: В PHP этот параметр устанавливается в ненулевое значение по умолчнию. Изменять его значение рекомендуется только при отладке.
CURLOPT_NOBODY : При установке этого параметра в ненулевое значение результат не будет включать документ (например, вам нужно получить только заголовки).
CURLOPT_FAILONERROR : При установке этого параметра в ненулевое значение, получение HTTP кода более 300 считается ошибкой.
CURLOPT_UPLOAD : Установка этого параметра в ненулевое значение означает, что будет производиться закачка файла на удаленный сервер.
CURLOPT_POST : При установке этого параметра в ненулевое значение будет отправлен HTTP запрос методом POST типа application/x-www-form-urlencoded , используемый браузерами при отправке форм.
CURLOPT_FTPLISTONLY : При установке этого параметра в ненулевое значение будет получен список файлов в директории FTP сервера.
CURLOPT_FTPAPPEND : При установке этого параметра в ненулевое значение данные будут добавляться к файлу на FTP сервере, в противном случае файл будет перезаписан.
CURLOPT_NETRC : При установке этого параметра в ненулевое значение будет сделана попытка найти имя пользователя и пароль к удаленному серверу в файле
CURLOPT_FOLLOWLOCATION : При установке этого параметра в ненулевое значение, при получении HTTP заголовка "Location: " будет происходить перенаправление на указанный этим заголовком URL (это действие выполняется рекурсивно, для каждого полученного заголовка "Location:").
CURLOPT_PUT : При установке этого параметра в ненулевое значение, будет производиться закачка файла методом HTTP PUT. Файл задается параметрами CURLOPT_INFILE и CURLOPT_INFILESIZE .
CURLOPT_MUTE : При установке этого параметра в ненулевое значение, все сообщения cURL будут подавляться.
CURLOPT_TIMEOUT : Задает масимальное время выполнения операции в секундах.
CURLOPT_LOW_SPEED_LIMIT : Задает минимальную скорость передачи в байтах в секунду. Если в течении времени, заданного параметром CURLOPT_LOW_SPEED_TIME , скорость передачи будет меньше этого значения, операция будет прервана.
CURLOPT_LOW_SPEED_TIME : Задает время в секундах, в течение которого скорость передачи должна быть ниже, чем CURLOPT_LOW_SPEED_LIMIT , чтобы операция была признана слишком медленной и прервана.
CURLOPT_RESUME_FROM : Задает позицию в файле в байтах, с которой начнется передача данных.
CURLOPT_CAINFO : Имя файла, содержащего один или более сертификатов, которые будут использованы при проверке подлинности удаленного сервера. Имеет значение только совместно с параметром CURLOPT_SSL_VERIFYPEER .
CURLOPT_SSL_VERIFYPEER : Установите этот параметр в ноль, чтобы запретить проверку сертификата удаленного сервера (начиная с curl 7.10, по умолчанию этот параметр имеет значение TRUE ). Дополнительные сертификаты можно задать с помощью параметра CURLOPT_CAINFO (добавленного в in curl 7.9.8). Можно также указать путь к файлам сертификатов в параметре CURLOPT_CAPATH . Если CURLOPT_SSL_VERIFYPEER установлен в 0, возможно, также потребуется установить CURLOPT_SSL_VERIFYHOST в 1 или 0 (по умолчанию 2).
CURLOPT_SSLVERSION : Целое число, указывающее, какую версию SSL использовать (2 или 3). По умолчанию версия SSL определяется автоматически, но в некоторых случаях требуется явное указание.
CURLOPT_SSL_VERIFYHOST : Задает проверку имени, указанного в сертификате удаленного сервера, при установлении SSL соединения. Значение 1 означает проверку существования имени, значение 2 — кроме того, и проверку соответствия имени хоста.
CURLOPT_TIMECONDITION : Задает способ интерпретации значения параметра CURLOPT_TIMEVALUE . Возможные значения: TIMECOND_IFMODSINCE или TIMECOND_ISUNMODSINCE. Применяется только для протокола HTTP.
CURLOPT_TIMEVALUE : Задает время в секундах с 1 января 1970 г. Это значение будет использовано в соответствии со значением параметра CURLOPT_TIMECONDITION (по умолчанию TIMECOND_IFMODSINCE).
CURLOPT_RETURNTRANSFER : При установке этого параметра в ненулевое значение CURL будет возвращать результат, а не выводить его.
Для перечисленных ниже параметров, value должен быть строкой:
CURLOPT_URL : URL, с которым будет производиться операция. Значение этого параметра также может быть задано в вызове функции curl_init() .
CURLOPT_USERPWD : Стока с именем пользователя и паролем в виде [username]:[password].
CURLOPT_PROXYUSERPWD : Стока с именем пользователя и паролем к HTTP прокси-серверу в виде [username]:[password].
CURLOPT_RANGE : Задает участок файла, который нужно загрузить, в формате "X-Y" , причем X или Y могут быть опущены. Протокол HTTP также поддерживает передачу нескольких фрагментов файла, это задается в виде "X-Y,N-M".
CURLOPT_POSTFIELDS : Строка, содержащая данные для HTTP POST запроса.
CURLOPT_REFERER : Задает значение HTTP заголовка "Referer: ".
CURLOPT_USERAGENT : Задает значение HTTP заголовка "User-Agent: ".
CURLOPT_FTPPORT : Задает значение, которое будет использоваться для определения IP адреса для команды "PORT" протокола ftp. Команда "PORT" сообщает серверу, с каким IP адресом он должен устанавливать соединение. Это может быть IP адрес, имя хоста, имя сетевого интерфейса (под Unix), или просто ‘-‘ для использования IP адреса по умолчанию.
CURLOPT_COOKIE : Содержимое заголовка "Cookie: ", который будет отправлен с HTTP запросом.
CURLOPT_SSLCERT : Имя файла с сертификатом в формате PEM.
CURLOPT_SSLCERTPASSWD : Пароль к файлу сертификата, заданному параметром CURLOPT_SSLCERT .
CURLOPT_COOKIEFILE : Имя файла, содержащего данные cookie. Данные могут быть либо в формате Netscape, либо просто HTTP-заголовки.
CURLOPT_CUSTOMREQUEST : Задает специальный метод, который будет использован в HTTP запросе вместо GET или HEAD . Это используется для отправке запросов DELETE или других, редко используемых. Допустимыми зачениями являются GET , POST , и т.д; не передавайте полный HTTP запрос в этом параметре. Например, ‘GET /index.html HTTP/1.0
‘ недопустимо.
Замечание: Перед использованием этого параметра убедитесь, что сервер, к которому вы обращаетесь, поддерживает требуемый метод.
CURLOPT_PROXY : Имя HTTP прокси, через который будут направляться запросы.
CURLOPT_INTERFACE : Имя используемого сетевого интерфейса. Может быть именем интерфейса, IP адресом или именем хоста.
CURLOPT_KRB4LEVEL : Уровень безопасности KRB4 (Kerberos 4). Допустимы следующие значения (в порядке возрастания безопасности) : ‘clear’, ‘safe’, ‘confidential’, ‘private’. Если переданное значение не входит в этот список, используется ‘private’. Установка этого параметра в NULL , запрещает безопасность KRB4 . В настоящее время безопасность KRB4 поддерживается только для протокола FTP.
CURLOPT_HTTPHEADER : Массив с HTTP заголовками.
CURLOPT_QUOTE : Массив с FTP командами, которые будут выполнены перед выполнением основного запроса.
CURLOPT_POSTQUOTE : Массив с FTP командами, которые будут выполнены после выполнения основного запроса.
Для перечисленных ниже параметров, value должен быть дескриптором файла, возвращенным функцией fopen() :
CURLOPT_FILE : Файл, в который будет выведен результат операции. По умолчанию STDOUT.
CURLOPT_INFILE : Файл, содержащий данные для передачи.
CURLOPT_WRITEHEADER : Файл, в который будут выведены полученные заголовки.
CURLOPT_STDERR : Файл, в который будут выводиться сообщения об ошибках. По умолчанию STDERR.
Пример 1. Инициализация сеанса CURL и загрузка web-страницы
| // инициализация сеанса $ch = curl_init (); |
// установка URL и других необходимых параметров
curl_setopt ( $ch , CURLOPT_URL , "http://www.example.com/" );
curl_setopt ( $ch , CURLOPT_HEADER , 0 );
// загрузка страницы и выдача её браузеру
curl_exec ( $ch );
Сегодня, этим сонным летним утром, я расскажу вам про SSL соединение из PHP скрипта. Расскажу исходя не только лишь из теории, а ещё и решая вполне себе практическую задачу — логин на гугловский блогосервис blogger.com.
Начнём с сокетов. В хелпе заявлена возможность использования HTTPS протокола, поэтому пробуем. Набор POST переменных взят из developer’s guide. Хабрапарсер обрамляет мыло ссылкой, поэтому "@" заменена на (at).
В функции fsockopen в качестве префикса перед именем сервера используем не https, а ssl. Так прямым текстом написано в хелпе. Дальше всё просто. Формируем HTTP-header, и пихаем его в открытый сокет. Читаем ответ, и получаем
Короче, если опустить часовые мытарства и пляски вокруг функций сокета, у меня ничего не вышло. Ну то есть не вышло передать POST данные, хотя GET запросы возвращаются нормально. Может это связано только с гугловским сервером, а где-то в другом месте получится.
UPD. Огромное спасибо хабраюзеру anabolik, который подсказал что если изменить одну строку заголовка и сделать
$send .= "Content-type: application/x-www-form-urlencoded
";
то всё сразу заработает. Ещё раз спасибо. Отблагодарил всякими способами =).
Переходим ко второму способу.
Открываем страницу мана про cURL и радуемся. Столько возможностей для запросов, для всякого конфигурирования. Должно получиться. Итак, лезем в curl_setopt. Нам понадобятся
CURLOPT_URL — это URL запроса.
CURLOPT_POST — говорим, что будем посылать POST запрос.
CURLOPT_POSTFIELDS — собственно POST переменыые.
CURLOPT_RETURNTRANSFER — вернуть результат запроса, а не выводить в браузер.
Теперь собственно о SSL параметрах:
CURLOPT_SSL_VERIFYPEER — если поставить его в 0, то удалённый сервер не будет проверять наш сертификат. В противном случае необходимо этот самый сертификат послать.
CURLOPT_CAINFO — указывать файл сертификата, если CURLOPT_SSL_VERIFYPEER установлен в 1.
CURLOPT_SSLVERSION — целое число, указывает версию SSL (2 или 3), обычно определяется автоматически.
CURLOPT_SSL_VERIFYHOST — будет ли производиться проверка имени удалённого сервера, указанного в сертификате. Если установить значение «2», то будет произведена ещё и проверка соответствия имени хоста. (если честно, я так и не понял что делает этот флаг)
Вот и всё. Нам для гугла понадобится только указать, что мы с собой никаких сертификатов не принесли, пустите нас так пожалуйста. Пишем код.
$postvars = array(
"Email" => "mail(at)gmail.com",
"Passwd" => "pass",
"service" => "blogger"
);
$postdata = "";
foreach ( $postvars as $key => $value )
$postdata .= "&".rawurlencode($key)."=".rawurlencode($value);
$postdata = substr( $postdata, 1 );
$ch = curl_init();
curl_setopt ($ch, CURLOPT_URL, "https://www.google.com/accounts/ClientLogin");
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec ($ch);
curl_close($ch);
В переменной $result у нас теперь находятся три строки, из которых нужна только одна — последняя, которая начинается с «Auth=». Но про это, наверное, в следующий раз.





