Библиотека CURL (Client URLs) позволяет передавать файлы на удаленный компьютер, используя множество Интернет протоколов. Она имеет очень гибкую настройку и позволяют выполнить практически любой удаленный запрос.
CURL поддерживает протоколы HTTP, HTTPS, FTP, FTPS, DICT, TELNET, LDAP, FILE, и GOPHER, так же как HTTP-post, HTTP-put, cookies, FTP-закачкe, продолжение прерванной передачи файлов, пароли, номера портов, сертификаты SSL, Kerberos и прокси.
Используя CURL, web-сервер может выступать полноценным клиентом любого основанного на HTTP протоколе сервисе, к примеру: XML-RPC, SOAP, или WebDAV.
В общем виде использование библиотеки сводиться к четырем шагам:
- Создание ресурса CURL c помощью функции curl_init.
- Установка параметров c помощью функции curl_setopt.
- Выполнение запроса c помощью функции curl_exec.
- Освобождение ресурса CURL c помощью функции curl_close.
Простой пример использования CURL
<?php // Иницализация библиотеки curl if ($ch = @curl_init()) { // Устанавливаем URL запроса @curl_setopt($ch, CURLOPT_URL, 'https://server.com/'); // При значении true CURL включает в вывод заголовки @curl_setopt($ch, CURLOPT_HEADER, false); // Куда помещать результат выполнения запроса: // false - в стандартный поток вывода, // true - в виде возвращаемого значения функции curl_exec. @curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Максимальное время ожидания в секундах @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); // Установим значение поля User-agent @curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (https://blog.yousoft.ru)'); // Выполнение запроса $data = @curl_exec($ch); // Вывести полученные данные echo $data; // Особождение ресурса @curl_close($ch); } ?>
Пример использования GET запроса
<?php $ch = curl_init(); // GET запрос указывается в строке URL curl_setopt($ch, CURLOPT_URL, 'https://server.com/?s=CURL'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (https://mysite.ru)'); $data = curl_exec($ch); curl_close($ch); ?>
Посылка GET запроса ничем не отличается от получения страницы. Важно заметить, что строка запроса формируется следующим образом:
https://server.com/index.php?name1=value1&name2=value2&name3=value3
где https://server.com/index.php — адрес страницы, nameX — название переменной, valueX — значение переменной.
Пример использования POST запроса
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'https://server.com/index.php'); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Нужно явно указать, что будет POST запрос curl_setopt($ch, CURLOPT_POST, true); // Здесь передаются значения переменных curl_setopt($ch, CURLOPT_POSTFIELDS, 's=CURL'); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30); curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (https://mysite.ru)'); $data = curl_exec($ch); curl_close($ch); ?>
Отправка POST запроса не многим отличается от отправки GET запроса. Все основные шаги остаются такие же. Переменные также задаются парами: name1=value1&name2=value2.
Пример HTTP-авторизации
<?php // HTTP авторизация $url = "https://server.com/protected/"; $ch = curl_init(); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword"); $result = curl_exec($ch); curl_close($ch); echo $result; ?>
или если нужно в header передать параметры
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/xml', 'Authorization: admin', 'X-Api-Key: YOURAPI' ));
Пример FTP-сессии
<?PHP $fp = fopen(__FILE__, "r"); $url = "ftp://username:password@mydomain.com:21/path/to/newfile.php"; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_UPLOAD, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_FTPASCII, 1); curl_setopt($ch, CURLOPT_INFILESIZE, filesize(__FILE__)); $result = curl_exec($ch); curl_close($ch); ?>
При возникновении проблем в использовании cURL необходимо добавить следующие строки перед вызовом curl_close для получения отчета о последнем выполненном запросе:
<?php print_r(curl_getinfo($ch)); echo "cURL error number:".curl_errno($ch)."<br/>"; echo "cURL error:".curl_error($ch)."<br/>"; curl_close($ch); ?>
И в завершение вкусняшка, пишем скрипт который авторизируется, отправляет данные и получает ответ.
$data = ["val"=>"aaaaaaa", "val2"=>"bbbbb"]; $result = post_to_url("https://www.site.com/stock_update.php", $data); function post_to_url($url, $data) { $fields = ''; foreach($data as $key => $value) { $fields .= $key . '=' . $value . '&'; } $fields = substr($fields,0,-1); $post = curl_init(); curl_setopt($post, CURLOPT_URL, $url); curl_setopt($post, CURLOPT_POST, count($data)); curl_setopt($post,CURLOPT_USERPWD,'login:password'); curl_setopt($post, CURLOPT_POSTFIELDS, $fields); curl_setopt($post, CURLOPT_RETURNTRANSFER, 1); $result = curl_exec($post); curl_close($post); $xml = simplexml_load_string($result); return $xml; }