Функции cURL
This is sample script to use curl, Just input curl_setopt,
exp :
curlsetop[0] ==> name : CURLOPT_URL ; value : http://amazon.com
curlsetop[1] ==> name : CURLOPT_RETURNTRANSFER ; value : true
curlsetop[2] ==> name : CURLOPT_FOLLOWLOCATION ; value : true
You can add form input.
function curl_test ( $setopt_content )
$ch = curl_init ();
curl_setopt_array ( $ch , $setopt_content );
$result_data = curl_exec ( $ch );
curl_close ( $ch );
return $result_data ;
>
if( $_REQUEST [ ‘submit_yes’ ]== «EXECUTE» )
foreach ( $_REQUEST [ ‘setopt_name’ ] as $k => $index_content )
<
$value_content = $_REQUEST [ ‘setopt_value’ ][ $k ];
$index_content = strtoupper ( $index_content );
eval( ‘$index_content = ‘ . $index_content . ‘;’ );
//echo ($index_content);
if( $index_content != » )
if( strtoupper ( $value_content )== ‘TRUE’ )
< $setopt_content [ $index_content ]= TRUE ;>
elseif( strtoupper ( $value_content )== ‘FALSE’ )
< $setopt_content [ $index_content ]= FALSE ;>
else
< $setopt_content [ $index_content ]= $value_content ;>
>
>
$info = curl_test ( $setopt_content );
19 years ago
A note of warning for PHP 5 users: if you try to fetch the CURLINFO_CONTENT_TYPE using curl_getinfo when there is a connect error, you will core dump PHP. I have informed the Curl team about this, so it will hopefully be fixed soon. Just make sure you check for an error before you look for this data.
15 years ago
Although it has been noted that cURL outperforms both file_get_contents and fopen when it comes to getting a file over a HTTP link, the disadvantage of cURL is that it has no way of only reading a part of a page at a time.
For example, the following code is likely to generate a memory limit error:
$ch = curl_init ( «http://www.example.com/reallybigfile.tar.gz» );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_BINARYTRANSFER , true );
$output = curl_exec ( $ch );
$fh = fopen ( «out.tar.gz» , ‘w’ );
fwrite ( $fh , $output );
fclose ( $fh );
?>
While this, on the other hand, wouldn’t
while (! feof ( $hostfile )) $output = fread ( $hostfile , 8192 );
fwrite ( $fh , $output );
>
fclose ( $hostfile );
fclose ( $fh );
?>
16 years ago
For anyone trying to use cURL to submit to an ASP/ASPX page that uses an image as the submit button.
Make sure that you have ‘button_name.x’ and ‘button_name.y’ in the post fields. PHP names these fields ‘button_name_x’ and ‘button_name_y’, while ASP uses a dot.
Also, as noted above, be sure to include the ‘__VIEWSTATE’ input field in your post request.
19 years ago
It took me quite some to to figure out how to get Curl (with SSL), OpenSSL and PHP to play nicely together.
After reinstalling MS-VC7 and compiling OpenSSL to finally realise this was’nt nesscary.
If your like me and like *Nix systems more than Windows then you’ll most probly have similar problems.
I came across this, on a simple google with the right keywords.
I read thru that and found my mistake.
Its just a small list of notes, I found them to be the best I’ve found on the subject and the most simplist.
Dont forget to add a simple line like this into your scripts to get them working on Win32.
if( $WINDIR ) curl_setopt ( $curl , CURLOPT_CAINFO , «c:\\windows\\ca-bundle.crt» );
?>
Last note: ca-bundle.crt file is located in the Curl download. I stored mine in the windows directory and apache/php can access it fine.
All the best and I hope this helps.
Simon Lightfoot
vHost Direct Limited
19 years ago
In recent versions of php, CURLOPT_MUTE has (probably) been deprecated. Any attempt of using curl_setopt() to set CURLOPT_MUTE will give you a warning like this:
PHP Notice: Use of undefined constant CURLOPT_MUTE — assumed ‘CURLOPT_MUTE’ in .
If you wish tu silence the curl output, use the following instead:
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
?>
And then,
$curl_output = curl_exec ( $ch );
?>
The output of the curl operation will be stored as a string in $curl_output while the operation remains totally silent.
14 years ago
Fixed bugs in the function posted earlier (better javascript redirect following and now supports HTTPS)
/*==================================
Get url content and response headers (given a url, follows all redirections on it and returned content and response headers of final url)
@return array[0] content
array[1] array of response headers
==================================*/
function get_url ( $url , $javascript_loop = 0 , $timeout = 5 )
$url = str_replace ( «&» , «&» , urldecode ( trim ( $url )) );
$cookie = tempnam ( «/tmp» , «CURLCOOKIE» );
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_USERAGENT , «Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1» );
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_COOKIEJAR , $cookie );
curl_setopt ( $ch , CURLOPT_FOLLOWLOCATION , true );
curl_setopt ( $ch , CURLOPT_ENCODING , «» );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , true );
curl_setopt ( $ch , CURLOPT_AUTOREFERER , true );
curl_setopt ( $ch , CURLOPT_SSL_VERIFYPEER , false ); # required for https urls
curl_setopt ( $ch , CURLOPT_CONNECTTIMEOUT , $timeout );
curl_setopt ( $ch , CURLOPT_TIMEOUT , $timeout );
curl_setopt ( $ch , CURLOPT_MAXREDIRS , 10 );
$content = curl_exec ( $ch );
$response = curl_getinfo ( $ch );
curl_close ( $ch );
if ( $response [ ‘http_code’ ] == 301 || $response [ ‘http_code’ ] == 302 )
ini_set ( «user_agent» , «Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1» );
if ( $headers = get_headers ( $response [ ‘url’ ]) )
foreach( $headers as $value )
if ( substr ( strtolower ( $value ), 0 , 9 ) == «location:» )
return get_url ( trim ( substr ( $value , 9 , strlen ( $value ) ) ) );
>
>
>
16 years ago
Using curl to take snapshots of the current page for emailing the HTML is a clever little idea. (ie: Email this page to a friend)
//to be explained below!
session_write_close ();
curl_setopt ( $ch , CURLOPT_URL, $pageurl );
$html = curl_exec ( $ch );
curl_close( $ch );
//then you need to fix pathing to absolute
$search keyword»>/( src | href | background )=\ «[^:,^>,^\»]*\»/i» ;
preg_match_all ( $search , $html , $a_matches );
//you can figure out the rest ! but thought the reg expression is useful as well
?>
But here is the catch, you may want to make sure curl connects to the server under the same session as the browser. So naturally you pass the session cookie through the curl system either by the cookie jar system, or through the query string in the path.
This is where you will get stuck. PHP will need write access to the same session file simultaneously!! causing serious hanging issues!
This is why you should close off your session before you make curl take a page snapshot!
17 years ago
Beware of any extra spaces in the URL. A trailing space in the URL caused my script to fail with the message «empty reply from server».
17 years ago
I had the following experience when harvesting urls with a get variable from a page using cUrl. HTML pages will output ampersands as & when the page is read by the curl function.
If you code a script to find all hyperlinks, it will use & instead of &, especially using a regular expression search.
It is hard to detect because when you output the url to the browser it renders the html. To fix, add a line to replace the & with &.
function processURL ( $url ) <
$url = str_replace ( ‘&’ , ‘&’ , $url );
$ch = curl_init ();
curl_setopt ( $ch , CURLOPT_URL , $url );
curl_setopt ( $ch , CURLOPT_RETURNTRANSFER , 1 );
$xml = curl_exec ( $ch );
curl_close ( $ch );
echo $xml ;
>
?>
17 years ago
Note that on Win32 this documentation can get a little confusing.
In order to get this to work you need to:
1) Be sure that the folder where libeay32.dll and ssleay32.dll — tipically C:\\PHP — is present on the PATH variable.
2) Uncomment — remove the semi-colon — the line that says «extension=php_curl.dll» from php.ini
3) Restart the webserver (you should already know this one, but. )
It took me some time to realize this, since this page doesn’t mention the need to uncomment that php.ini’s line.
2 years ago
This is sample script to use curl, Just input curl_setopt,
exp :
curlsetop[0] ==> name : CURLOPT_URL ; value : https://amzn.to/3njlWW6
curlsetop[1] ==> name : CURLOPT_RETURNTRANSFER ; value : true
curlsetop[2] ==> name : CURLOPT_FOLLOWLOCATION ; value : true
You can add form input.
function curl_test ( $setopt_content )
$ch = curl_init ();
curl_setopt_array ( $ch , $setopt_content );
$result_data = curl_exec ( $ch );
curl_close ( $ch );
return $result_data ;
>
if( $_REQUEST [ ‘submit_yes’ ]== «EXECUTE» )
foreach ( $_REQUEST [ ‘setopt_name’ ] as $k => $index_content )
<
$value_content = $_REQUEST [ ‘setopt_value’ ][ $k ];
$index_content = strtoupper ( $index_content );
eval( ‘$index_content = ‘ . $index_content . ‘;’ );
//echo ($index_content);
if( $index_content != » )
if( strtoupper ( $value_content )== ‘TRUE’ )
< $setopt_content [ $index_content ]= TRUE ;>
elseif( strtoupper ( $value_content )== ‘FALSE’ )
< $setopt_content [ $index_content ]= FALSE ;>
else
< $setopt_content [ $index_content ]= $value_content ;>
>
>
$info = curl_test ( $setopt_content );
19 years ago
If you have upgraded to using thread safe PHP (with apache 2 MPM=worker) note that
CURLOPT_COOKIEJAR / CURLOPT_COOKIEFILE both need an absolute path set for the cookie file location and no longer take a relative path.
(As before, also remember to have set correct permissions to allow a writeable cookie file/dir by apache)
[php 4.3.7/apache v2.0.49]
- cURL
- Введение
- Установка и настройка
- Предопределённые константы
- Примеры
- Функции cURL
- CurlHandle
- CurlMultiHandle
- CurlShareHandle
- CURLFile
- CURLStringFile
- Copyright © 2001-2023 The PHP Group
- My PHP.net
- Contact
- Other PHP.net sites
- Privacy policy
Основы библиотеки cURL PHP
cURL — библиотека с открытым исходным кодом, используемая для отправки HTTP-запросов с различных языков программирования, включая C, PHP и другие.
cURL также является программой командной строки, позволяющая взаимодействовать с множеством различных серверов.
Libcurl — это библиотека API для передачи, которую разработчики могут встроить в свои программы; cURL действует как автономная обёртка для библиотеки libcurl. Для libcurl имеются модули интеграции для работы с более чем 30 языками программирования.cURL работает по множеству различных протоколов с синтаксисом URL. В данной статье рассмотрена работа библиотеки по протоколу HTTP/HTTPS.
Модуль PHP cURL обычно включён по умолчанию. Если это не так, то в файле php.ini уберите точку с запятой (;) у строки extension=php_curl.dll.
Настройка параметров сеанса
Для установки параметра сеанса cURL используется функция curl_setopt.
- handle — дескриптор cURL, полученный из curl_init().
- option — параметр сеанса в виде CURLOPT_XXX.
- value — значение параметра option.
Функция возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Сразу несколько параметров сеанса можно установить с помощью функции curl_setopt_array.
options — ассоциативный массив, определяющий устанавливаемые параметры и их значения. Ключи должны быть корректными константами для функции curl_setopt() или их целочисленными эквивалентами.
Функция возвращает true, если все параметры были успешно установлены. Если не удалось успешно установить какой-либо параметр, немедленно возвращается значение false, все последующие параметры игнорируются.Роль параметров сеанса играют предопределённые константы. Рассмотрим основные из них.
CURLOPT_URL — параметр, который задает адрес ресурса, с которым вы хотите взаимодействовать или с которого хотите получить данные. Параметр является обязательным и должен быть установлен перед вызовом curl_exec().
CURLOPT_RETURNTRANSFER — константа, устанавливающая значение дескриптора cURL так, чтобы ответ от сервера возвращался в виде строкового значения вместо отправки непосредственно в поток вывода.
При установке CURLOPT_RETURNTRANSFER в значение true или 1, константа сообщает cURL вернуть ответ из HTTP-запроса в виде строки, которую затем можно сохранить в переменной или обработать по мере необходимости. Если этот параметр не задан или имеет значение false, ответ на HTTP-запрос будет отправлен непосредственно в поток вывода (например, в окно браузера или файл, установленный параметром CURLOPT_FILE).CURLOPT_HEADER — параметр, который указывает, следует ли включать заголовок в ответ (true — для включения).Заголовок содержит информацию об ответе, такую как код состояния HTTP, тип содержимого и др.
Для получения информации об ответе также можно использовать функцию curl_getinfo()(будет рассмотрена позже в статье).CURLOPT_HTTPHEADER — параметр cURL, который задает HTTP-заголовки, отправляемые вместе с запросом. Параметр принимает массив строк. Каждая строка должна содержать имя заголовка и его значение, разделенные двоеточием.
CURLOPT_FOLLOWLOCATION — константа, которая используется для настройки поведения cURL в случае, если сервер возвращает заголовок «Location» как часть ответа, код состояния которого находится в диапазоне 300 – 399 (сообщения о перенаправлении). Заголовок «Location» содержит в себе URL для редиректа.
Когда CURLOPT_FOLLOWLOCATION установлена в значение 1, cURL будет автоматически следовать любым редиректам, делая дополнительные запросы к новому URL до тех пор, пока в ответе не будет содержаться заголовок «Location». Значение по умолчанию — 0.CURLOPT_POST — константа, указывающая, следует ли отправлять запрос методом POST. По умолчанию cURL отправляет GET-запросы. Если CURLOPT_POST установлен в значении 1 или true, то будет отправлен POST-запрос.
CURLOPT_POSTFIELDS — это параметр cURL, используемый для установки тела POST-запроса. Формат данных зависит от типа, указанного в заголовке Content-Type.
Простой GET-запрос
Простой POST-запрос
Чтобы сделать POST-запрос, нужно установить параметры CURLOPT_POST и CURLOPT_POSTFIELDS.
Существует несколько форматов тела запроса:
2) Строка запроса HTTP
Для построения строки запроса используется функция http_build_query.
3) Формат массива POST
"value1", "key2"=>"value2"); ?>Для отправки файлов в тело запроса применяется класс CURLFile. Чтобы создать экземпляр класса можно воспользоваться конструктором или функцией curl_file_create. Экземпляр класса передаётся константе CURLOPT_POSTFIELDS как элемент массива.
Обработка исключений/ошибок
Обработка ошибок в ходе сеанса cURL осуществляется с помощью функций curl_errno и curl_error, которые фиксируют любые ошибки, возникающие во время сеанса.
curl_errno — принимает дескриптор cURL, полученный из curl_init() и возвращает номер ошибки последней операции cURL.
curl_error также принимает дескриптор, но возвращает строку с описанием последней ошибки текущего сеанса. Строка содержит информацию о том, что пошло не так во время операции cURL, что может пригодиться во время отладки.
Важно проверять значение curl_errno после операции cURL, чтобы убедиться, что операция завершена успешно, а также выявить и устранить любые ошибки, которые могли возникнуть.
Пример POST-запроса с телом формате JSON, обработкой исключений, и обработкой ответа от сервера
'http://domain-name/endpoint-path', CURLOPT_POST => 1, CURLOPT_RETURNTRANSFER => 1, CURLOPT_FOLLOWLOCATION => 1, CURLOPT_HTTPHEADER => array( 'Content-Type' => 'application/json' ) ); // Сериализация тела запроса $data = array('field1' => 'value1', 'field2' => 'value2'); $json_req = json_encode($data); // Установка тела запроса $CurlOptions[CURLOPT_POSTFIELDS] = $json_req; // Инициализация сеанса $ch = curl_init(); // установка параметров сеанса curl_setopt_array( $ch, $CurlOptions ); // Выполнение запроса, в переменной хранится ответ от сервера $data = curl_exec( $ch ); //получение информацию о сеансе $info = curl_getinfo($ch); // если в ходе сеанса произошла ошибка // или если код HTTP-ответа не в диапазоне 200 – 299 (успешные запросы) if (curl_errno($ch) || substr($info['http_code'],0,1) !== '2') < // вызов пользовательского исключения throw new CustomException(curl_error($ch), $data, $info); >// закрытие сеанса curl_close( $ch ); ?>В данном примере информация о последнем сеансе была получена с помощью функции curl_getinfo(). Функция возвращает массив информации о различных характеристиках сеанса, таких как код ответа HTTP, тип содержимого, общее время и т.д.
Проверка SSL-сертификата
Для проверки SSL-сертификата необходимо использовать константу CURLOPT_SSL_VERIFYPEER.
CURLOPT_SSL_VERIFYPEER — это константа, которая определяет, должен ли curl проверять подлинность SSL-сертификата. Если установлено значение true, curl проверяет SSL-сертификат, представленный удаленным сервером, и выдаёт ошибку, если это сертификат недействительный Если установлено значение false, curl не проверяет SSL-сертификат и разрешает подключение, даже если SSL-сертификат недействителен. Однако это может привести к уязвимостям в системе безопасности. По умолчанию установлено значение true.
CURLOPT_SSL_VERIFYPEER работает только для SSL-соединений, при подключении к http-серверам константа будет проигнорирована.
Аутентификация на сервере
CURLOPT_HTTPAUTH — это константа, которая используется для установки типа HTTP-аутентификации, используемой для запроса.
CURLAUTH_BASIC, CURLOPT_USERPWD => "login:password"); ?>Константа принимает следующие значения:
- CURLAUTH_BASIC: Базовая аутентификация HTTP, которая отправляет имя пользователя и пароль по сети в виде обычного текста, легко перехватываемого другими.
- CURLAUTH_DIGEST: Аутентификация HTTP Digest, которая использует хэш-функцию для шифрования пароля перед отправкой его на сервер.
- CURLAUTH_GSSNEGOTIATE: HTTP GSS-Negotiate аутентификация, которая является способом обеспечения безопасной аутентификации с использованием Kerberos.
- CURLAUTH_NTLM: Аутентификация NTLM, которая представляет собой механизм запроса-ответа, используемый Windows. В данном случае используется концепция хэширования, аналогичная Digest, чтобы предотвратить перехват пароля.
- CURLAUTH_ANY: Сообщает cURL попробовать все поддерживаемые методы аутентификации. cURL автоматически выберет тот, который он сочтет наиболее безопасным.
- CURLAUTH_ANYSAFE: Работает аналогично CURLAUTH_ANY, но в этом случае cURL будет пробовать только безопасные методы (все методы кроме CURLAUTH_BASIC).
Значение по умолчанию: CURLAUTH_BASIC.
Значения могут быть объединены с помощью побитового ИЛИ. Например, CURLAUTH_BASIC | CURLAUTH_DIGEST. cURL выберет наиболее подходящий метод из представленных.
При использовании HTTPS все данные передаются в зашифрованном виде. При такой передаче CURLOPT_HTTPAUTH предоставляет дополнительные меры безопасности для обеспечения подлинности клиента и сервера и предотвращения несанкционированного доступа.
ИТОГ
cURL — удобная библиотека для передачи данных между клиентом и сервером. cURL позволяет взаимодействовать с множеством различных серверов по различным протоколам: http, https, ftp, gopher, telnet, dict, file и ldap.
Библиотека легка в использовании. cURL предоставляет инструменты для простых GET-запросов, но также имеет дополнительный функционал:
- работа с сертификатами HTTPS;
- загрузка файлов по протоколам HTTP и FTP (последнее можно сделать с помощью модуля FTP);
- использование прокси-серверы;
- cookies;
- аутентификация пользователей.
Примеры использования cURL в PHP
cURL PHP – это библиотека предназначенная для получения и передачи данных через такие протоколы, как HTTP, FTP, HTTPS. Библиотека используется для получения данных в виде XML, JSON и непосредственно в HTML, парсинга, загрузки и передачи файлов и т.д.
GET запрос
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;GET-запрос с параметрами
$get = array( 'name' => 'Alex', 'email' => 'mail@example.com' ); $ch = curl_init('https://example.com?' . http_build_query($get)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;POST запрос
$array = array( 'login' => 'admin', 'password' => '1234' ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;Отправка JSON через POST-запрос
$data = array( 'name' => 'Маффин', 'price' => 100.0 ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:application/json')); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data, JSON_UNESCAPED_UNICODE)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch); $res = json_encode($res, JSON_UNESCAPED_UNICODE); print_r($res);PUT запрос
HTTP-метод PUT используется в REST API для обновления данных.
$data = array( 'name' => 'Маффин', 'price' => 100.0 ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT'); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;DELETE запрос
HTTP-метод DELETE используется в REST API для удаления объектов.
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'DELETE'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);Запрос через proxy
$proxy = '165.22.115.179:8080'; $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_TIMEOUT, 400); curl_setopt($ch, CURLOPT_PROXY, $proxy); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);Отправка файлов на другой сервер
Отправка файлов осуществляется методом POST :
До PHP 5.5
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => '@' . __DIR__ . '/image.png'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);С PHP 5.5 следует применять CURLFile.
$curl_file = curl_file_create(__DIR__ . '/image.png', 'image/png' , 'image.png'); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, array('photo' => $curl_file)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch);Также через curl можно отправить сразу несколько файлов:
$curl_files = array( 'photo[0]' => curl_file_create(__DIR__ . '/image.png', 'image/png' , 'image.png'), 'photo[1]' => curl_file_create(__DIR__ . '/image-2.png', 'image/png' , 'image-2.png') ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $curl_files); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $res = curl_exec($ch); curl_close($ch);Ещё файлы можно отправить методом PUT , например так загружаются файлы в REST API Яндекс Диска.
$file = __DIR__ . '/image.jpg'; $fp = fopen($file, 'r'); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_PUT, true); curl_setopt($ch, CURLOPT_UPLOAD, true); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($file)); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch);Скачивание файлов
Curl позволяет сохранить результат сразу в файл, указав указатель на открытый файл в параметре CURLOPT_FILE .
$file_name = __DIR__ . '/file.html'; $file = @fopen($file_name, 'w'); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_FILE, $file); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); curl_close($ch); fclose($file);$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); file_put_contents(__DIR__ . '/file.html', $html);Отправить и получить cookie
Чтобы CURL сохранял куки в файле достаточно прописать его путь в параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);Передать значение кук можно принудительно через параметр CURLOPT_COOKIE .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_COOKIE, 'PHPSESSID=61445603b6a0809b061080ed4bb93da3'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch);Имитация браузера
На многих сайтах есть защита от парсинга. Она основана на том что браузер передает серверу user agent , referer , cookie . Сервер проверяет эти данные и возвращает нормальную страницу. При подключение через curl эти данные не передаются и сервер отдает ошибку 404 или 500. Чтобы имитировать браузер нужно добавить заголовки:
$headers = array( 'cache-control: max-age=0', 'upgrade-insecure-requests: 1', 'user-agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36', 'sec-fetch-user: ?1', 'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3', 'x-compress: null', 'sec-fetch-site: none', 'sec-fetch-mode: navigate', 'accept-encoding: deflate, br', 'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7', ); $ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt'); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, true); $html = curl_exec($ch); curl_close($ch); echo $html;HTTP авторизация
Basic Authorization
Если на сервере настроена HTTP авторизация, например с помощью .htpasswd, подключится к нему можно с помощью параметра CURLOPT_USERPWD .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_USERPWD, 'login:password'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;OAuth авторизация
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: OAuth TOKEN')); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_HEADER, false); $html = curl_exec($ch); curl_close($ch); echo $html;Получить HTTP код ответа сервера
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); echo $http_code; // Выведет: 200Если CURL возвращает false
Какая произошла ошибка можно узнать с помощью функции curl_errno() .
$ch = curl_init('https://example.com'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_exec($ch); $res = curl_exec($ch); var_dump($res); // false if ($errno = curl_errno($ch)) < $message = curl_strerror($errno); echo "cURL error ():\n "; // Выведет: cURL error (35): SSL connect error > curl_close($ch);curl_setopt
true для отмены индикатора прогресса при передачах cURL.
Замечание:
PHP автоматически устанавливает этот параметр в true , меняйте его только для отладочных целей.
Используемые HTTP-методы авторизации. Используемые параметры: CURLAUTH_BASIC , CURLAUTH_DIGEST , CURLAUTH_GSSNEGOTIATE , CURLAUTH_NTLM , CURLAUTH_ANY и CURLAUTH_ANYSAFE .
Можно использовать побитовый оператор | (или) для комбинации нескольких методов вместе. В этом случае cURL опросит сервер на предмет поддерживаемых методов авторизации и выберет лучший из них.
CURLAUTH_ANY — это псевдоним CURLAUTH_BASIC | CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .
CURLAUTH_ANYSAFE — это псевдоним CURLAUTH_DIGEST | CURLAUTH_GSSNEGOTIATE | CURLAUTH_NTLM .
Битовая маска из значений 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
Метод аутентификации SOCKS5, который нужно использовать. Варианты: CURLAUTH_BASIC , CURLAUTH_GSSAPI , CURLAUTH_NONE .
Побитовый оператор | (или) можно использовать для объединения нескольких методов. Если это будет сделано, cURL будет опрашивать сервер, чтобы выяснить, какие методы он поддерживает, и выбрать наилучший.
CURLAUTH_BASIC разрешает аутентификацию по constant пользователя/пароля.
CURLAUTH_GSSAPI разрешает аутентификацию GSS-API.
CURLAUTH_NONE не разрешает аутентификацию.
По умолчанию CURLAUTH_BASIC|CURLAUTH_GSSAPI . Установите действительное имя пользователя и пароль с помощью параметра CURLOPT_PROXYUSERPWD .
Замечание:
Рекомендуется не устанавливать эту опцию и оставить значение по умолчанию. Установка в 2 или 3 опасно и допускает применение известных уязвимостей в SSLv2 и SSLv3.
Замечание:
Лучше всего не устанавливать это и разрешать использовать значение по умолчанию CURL_SSLVERSION_DEFAULT , которое попытается выяснить версию протокола удалённого SSL.
Собственный метод запроса, используемый вместо «GET» или «HEAD» при выполнении HTTP-запроса. Это полезно при запросах «DELETE» или других, более редких HTTP-запросах. Корректными значениями будут такие как «GET» , «POST» , «CONNECT» и так далее; т.е. не вводите здесь всю строку с HTTP-запросом. Например, указание «GET /index.html HTTP/1.0\r\n\r\n» будет неправильным.
Замечание:
Не используйте эту возможность пока не убедитесь, что сервер поддерживает данный тип запроса.
Протокол по умолчанию, если он отсутствует в схеме URL.
Устанавливает имя сетевого интерфейса, к которому привязан DNS. Это должно быть имя интерфейса, а не адрес.
Установить локальный IPv4-адрес, по которому доступне DNS. Адрес должен быть представлен в виде строки, содержащий одно число.
Установить локальный IPv6-адрес, по которому доступне DNS. Адрес должен быть представлен в виде строки, содержащий одно число.
Замечание:
Аутентификация Secure Remote Password (SRP) для TLS обеспечивает взаимную аутентификацию, если обе стороны имеют общий секрет. Чтобы использовать TLS-SRP, вы также должны установить параметры CURLOPT_PROXY_TLSAUTH_USERNAME и CURLOPT_PROXY_TLSAUTH_PASSWORD .
Тайный пароль, необходимый для использования закрытого ключа SSL, указанного параметром CURLOPT_SSLKEY .
Замечание:
Так как этот параметр содержит ценный пароль, помните, что данный PHP-скрипт нужно хранить в безопасном месте.
Для следующих значений параметра option , параметр value должен быть массивом:
Параметр Устанавливаемое значение value Замечания CURLOPT_CONNECT_TO Соединяться с указанный хостом по указанному порту, игнорируя URL. Принимает массив строк формата HOST:PORT:CONNECT-TO-HOST:CONNECT-TO-PORT . Добавлено в cURL 7.49.0. Доступно с PHP 7.0.7. CURLOPT_HTTP200ALIASES Массив HTTP 200 ответов, которые будут трактоваться корректными ответами, а не ошибочными. Добавлен в cURL 7.10.3. CURLOPT_HTTPHEADER Массив устанавливаемых HTTP-заголовков, в формате array(‘Content-type: text/plain’, ‘Content-length: 100’) CURLOPT_POSTQUOTE Массив FTP-команд, выполняемых на сервере, после выполнения FTP-запроса. CURLOPT_PROXYHEADER Массив пользовательских HTTP-заголовков для отправки на прокси Добавлено в cURL 7.37.0. Доступно с PHP 7.0.7. CURLOPT_QUOTE Массив FTP-команд, выполняемых на сервере, перед выполнением FTP-запроса. CURLOPT_RESOLVE Предоставляет адрес для определённой пары хоста и порта. Массив, содержащий строки состоящие из имени хоста, порта и IP-адреса, разделённых двоеточием. Пример: array(«example.com:80:127.0.0.1») Добавлено в cURL 7.21.3. Для следующих значений параметра option , параметр value должен быть потоковым дескриптором (возвращаемым, например, функцией fopen() ):
Параметр Устанавливаемое значение value CURLOPT_FILE Файл, в который будет записан результат передачи. По умолчанию используется поток вывода STDOUT (окно браузера). CURLOPT_INFILE Файл, из которого должно идти чтение данных, при загрузке на сервер. CURLOPT_STDERR Альтернативный файл для вывода ошибок, используемый вместо потока ошибок STDERR . CURLOPT_WRITEHEADER Файл, в который будут записаны заголовки текущей операции. Callback-функция принимает пять параметров. Первый является декскриптором cURL, второй — общим количеством байт, которое ожидается загрузить с сервера, третий — количество уже загруженных байт, четвёртый — общее количество байт, которое ожидается отправить на сервер, и пятый — количество уже отправленных байт.
Замечание:
Callback-функция вызывается только, если опция CURLOPT_NOPROGRESS установлена в значение false .
Можно вернуть ненулевое значение, чтобы отменить передачу. В этом случае будет выдана ошибка CURLE_ABORTED_BY_CALLBACK .
Другие значения:
Параметр Устанавливаемое значение value CURLOPT_SHARE Результат выполнения функции curl_share_init() . Позволяет обработчику cURL использовать данные из общего обработчика. Возвращаемые значения
Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.
Список изменений
Версия Описание 8.0.0 handle теперь ожидает экземпляр CurlHandle ; раньше, ожидался ресурс ( resource ). 7.3.15, 7.4.3 Добавлено CURLOPT_HTTP09_ALLOWED . 7.3.0 Введены CURLOPT_ABSTRACT_UNIX_SOCKET , CURLOPT_KEEP_SENDING_ON_ERROR , CURLOPT_PRE_PROXY , CURLOPT_PROXY_CAINFO , CURLOPT_PROXY_CAPATH , CURLOPT_PROXY_CRLFILE , CURLOPT_PROXY_KEYPASSWD , CURLOPT_PROXY_PINNEDPUBLICKEY , CURLOPT_PROXY_SSLCERT , CURLOPT_PROXY_SSLCERTTYPE , CURLOPT_PROXY_SSL_CIPHER_LIST , CURLOPT_PROXY_SSLKEY , CURLOPT_PROXY_SSLKEYTYPE , CURLOPT_PROXY_SSL_OPTIONS , CURLOPT_PROXY_SSL_VERIFYHOST , CURLOPT_PROXY_SSL_VERIFYPEER , CURLOPT_PROXY_SSLVERSION , CURLOPT_PROXY_TLSAUTH_PASSWORD , CURLOPT_PROXY_TLSAUTH_TYPE , CURLOPT_PROXY_TLSAUTH_USERNAME , CURLOPT_SOCKS5_AUTH , CURLOPT_SUPPRESS_CONNECT_HEADERS , CURLOPT_DISALLOW_USERNAME_IN_URL , CURLOPT_DNS_SHUFFLE_ADDRESSES , CURLOPT_HAPPY_EYEBALLS_TIMEOUT_MS , CURLOPT_HAPROXYPROTOCOL , CURLOPT_PROXY_TLS13_CIPHERS , CURLOPT_SSH_COMPRESSION , CURLOPT_TIMEVALUE_LARGE и CURLOPT_TLS13_CIPHERS . 7.0.7 Добавлены CURL_HTTP_VERSION_2 , CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE , CURL_HTTP_VERSION_2TLS , CURL_REDIR_POST_301 , CURL_REDIR_POST_302 , CURL_REDIR_POST_303 , CURL_REDIR_POST_ALL , CURL_VERSION_KERBEROS5 , CURL_VERSION_PSL , CURL_VERSION_UNIX_SOCKETS , CURLAUTH_NEGOTIATE , CURLAUTH_NTLM_WB , CURLFTP_CREATE_DIR , CURLFTP_CREATE_DIR_NONE , CURLFTP_CREATE_DIR_RETRY , CURLHEADER_SEPARATE , CURLHEADER_UNIFIED , CURLMOPT_CHUNK_LENGTH_PENALTY_SIZE , CURLMOPT_CONTENT_LENGTH_PENALTY_SIZE , CURLMOPT_MAX_HOST_CONNECTIONS , CURLMOPT_MAX_PIPELINE_LENGTH , CURLMOPT_MAX_TOTAL_CONNECTIONS , CURLOPT_CONNECT_TO , CURLOPT_DEFAULT_PROTOCOL , CURLOPT_DNS_INTERFACE , CURLOPT_DNS_LOCAL_IP4 , CURLOPT_DNS_LOCAL_IP6 , CURLOPT_EXPECT_100_TIMEOUT_MS , CURLOPT_HEADEROPT , CURLOPT_LOGIN_OPTIONS , CURLOPT_PATH_AS_IS , CURLOPT_PINNEDPUBLICKEY , CURLOPT_PIPEWAIT , CURLOPT_PROXY_SERVICE_NAME , CURLOPT_PROXYHEADER , CURLOPT_SASL_IR , CURLOPT_SERVICE_NAME , CURLOPT_SSL_ENABLE_ALPN , CURLOPT_SSL_ENABLE_NPN , CURLOPT_SSL_FALSESTART , CURLOPT_SSL_VERIFYSTATUS , CURLOPT_STREAM_WEIGHT , CURLOPT_TCP_FASTOPEN , CURLOPT_TFTP_NO_OPTIONS , CURLOPT_UNIX_SOCKET_PATH , CURLOPT_XOAUTH2_BEARER , CURLPROTO_SMB , CURLPROTO_SMBS , CURLPROXY_HTTP_1_0 , CURLSSH_AUTH_AGENT и CURLSSLOPT_NO_REVOKE . Примеры
Пример #1 Инициализация сеанса CURL и загрузка веб-страницы
// создание нового ресурса cURL
$ch = curl_init ();?php
// установка URL и других необходимых параметров
curl_setopt ( $ch , CURLOPT_URL , «http://www.example.com/» );
curl_setopt ( $ch , CURLOPT_HEADER , false );// загрузка страницы и выдача её браузеру
curl_exec ( $ch );// завершение сеанса и освобождение ресурсов
curl_close ( $ch );
?>Примечания
Замечание:
Передача массива в CURLOPT_POSTFIELDS закодирует данные в виде multipart/form-data, тогда как передача URL-кодированной строки закодирует данные в виде application/x-www-form-urlencoded.
Смотрите также
- curl_setopt_array() — Устанавливает несколько параметров для сеанса cURL
- CURLFile
- CURLStringFile
