Библиотека 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php // Иницализация библиотеки curl if ($ch = @curl_init()) { // Устанавливаем URL запроса @curl_setopt($ch, CURLOPT_URL, 'http://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 (http://blog.yousoft.ru)'); // Выполнение запроса $data = @curl_exec($ch); // Вывести полученные данные echo $data; // Особождение ресурса @curl_close($ch); } ?> |
Пример использования GET запроса
1 2 3 4 5 6 7 8 9 10 11 |
<?php $ch = curl_init(); // GET запрос указывается в строке URL curl_setopt($ch, CURLOPT_URL, 'http://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 (http://mysite.ru)'); $data = curl_exec($ch); curl_close($ch); ?> |
Посылка GET запроса ничем не отличается от получения страницы. Важно заметить, что строка запроса формируется следующим образом:
1 |
http://server.com/index.php?name1=value1&name2=value2&name3=value3 |
где http://server.com/index.php — адрес страницы, nameX — название переменной, valueX — значение переменной.
Пример использования POST запроса
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://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 (http://mysite.ru)'); $data = curl_exec($ch); curl_close($ch); ?> |
Отправка POST запроса не многим отличается от отправки GET запроса. Все основные шаги остаются такие же. Переменные также задаются парами: name1=value1&name2=value2.
Пример HTTP-авторизации
1 2 3 4 5 6 7 8 9 10 11 |
<?php // HTTP авторизация $url = "http://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 передать параметры
1 2 3 4 5 |
curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'Content-type: application/xml', 'Authorization: admin', 'X-Api-Key: YOURAPI' )); |
Пример FTP-сессии
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?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 для получения отчета о последнем выполненном запросе:
1 2 3 4 5 6 |
<?php print_r(curl_getinfo($ch)); echo "cURL error number:".curl_errno($ch)."<br/>"; echo "cURL error:".curl_error($ch)."<br/>"; curl_close($ch); ?> |
И в завершение вкусняшка, пишем скрипт который авторизируется, отправляет данные и получает ответ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
$data = ["val"=>"aaaaaaa", "val2"=>"bbbbb"]; $result = post_to_url("http://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; } |