Просто о библиотеке cURL

В большинстве случаев, чтобы получить удалённую страницу пользуются такими функциями:

$content = file_get_contents("http://conture.by");  /* помещает в $content всю загруженную страницу */
$lines = file("http://conture.by");  /* создаёт массив строк из исходной страницы */
readfile("http://conture.by");  /* запишет исходный файл в буфер вывода */

Большой минус этих функций в том, что они, по сути, не имеют никакой гибкости в плане обработки ошибок, а также невозможность их взаимодействия с Cookie, аутентификацией, передачей файлов и отправкой форм.

cURL — это библиотека, которая призвана помочь программистам с вышеперечисленными недостатками.

Базовая структура использования библиотеки cURL состоит из четырёх основных шагов:

// 1. инициализация
$ch = curl_init();
 
// 2. указываем параметры, включая url
curl_setopt($ch, CURLOPT_URL, "http://conture.by");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);

// 3. получаем HTML в качестве результата
$output = curl_exec($ch);

/* 3.1 дополнительный шаг. Получаем массив с результатами выполнения:
“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” */
$info = curl_getinfo($ch); 
 
// 4. закрываем соединение
curl_close($ch);

Выполнить POST запрос к странице при помощи cURL:

$url = "http://conture.by/post"; 

$post_data = array (
  "one" => "first",
  "two" => "second",
  "three" => "third"
);

$ch = curl_init();  /* иницианализация */
curl_setopt($ch, CURLOPT_URL, $url); /* добавляем в опции URL назначения */
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);  /* 0 - выведет в браузер; 1 - возвратит ответ */
curl_setopt($ch, CURLOPT_POST, 1);  /* указываем, что у нас POST запрос */
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);  /* добавляем переменные */

$output = curl_exec($ch);  /* выполняем запрос */
curl_close($ch);  /* закрываем */
echo $output;  /* выводим на экран */

Передать файл с нашего сервера на удалённый:

$url = "http://localhost/upload_output.php"; /* понятное дело, что этот скрипт должен принимать файлы */
$post_data = array (
  "foo" => "bar",
  // файл, который необходимо загрузить
  "upload" => "@C:/test.zip"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

Пример, как осуществить множественный cURL:

// создаём несколько cURL ресурсов
$ch1 = curl_init();
$ch2 = curl_init();

// указываем URL и другие параметры
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.net/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);

//создаём множественный cURL обработчик
$mh = curl_multi_init();

//добавляем несколько обработчиков
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);

$active = null;
//выполнение
  do {
      $mrc = curl_multi_exec($mh, $active);
  } while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
  while ($active && $mrc == CURLM_OK) {
      if (curl_multi_select($mh) != -1) {
          do {
  	            $mrc = curl_multi_exec($mh, $active);
  	        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
  	    }
  }
 	 
//закрытие
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

HTTP Аутентификация при помощи cURL

$url = "http://www.somesite.com/members/";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// указываем имя и пароль
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");

// если перенаправление разрешено 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// то сохраним наши данные в cURL
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);

$output = curl_exec($ch);

curl_close($ch);

Загрузка файла по FTP с помощью cURL:

// открываем файл
$file = fopen("/path/to/file", "r");

// в url должно быть следующее содержание
$url = "ftp://username:password@mydomain.com:21/path/to/new/file";

$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_INFILESIZE, filesize("/path/to/file"));

// указывам ASCII мод
curl_setopt($ch, CURLOPT_FTPASCII, 1);

$output = curl_exec($ch);
curl_close($ch);

Выполнить запрос к странице через proxy с помощью cURL:

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,'http://www.example.com');

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);

// указываем адрес
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');

// если необходимо предоставить имя пользователя и пароль
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass');

$output = curl_exec($ch);

curl_close ($ch);

Авторизация на сайте с использованием COOKIE:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/personal/login.phtml"); /* Переходим на страницу, на которой нужно пройти процедуру авторизации */
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "login=mylog&psw=mypassword"); 
curl_setopt($ch, CURLOPT_COOKIEJAR,$_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt');
$result = curl_exec($ch);
curl_setopt($ch, CURLOPT_URL, "http://example.com"); /* Теперь заходите на сайт как авторизованный пользователь – в данном случае нужно вместо example.com указать URL страницы, на которую может попасть только авторизованный пользователь */
curl_setopt($ch, CURLOPT_POST, 0); /* Также необязательное действие, но я указал этот параметр – устанавливаю CURLOPT_POST в нуль, ведь теперь мне не нужно передавать данные методом POST */
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookiefile.txt'); /* Внимание! Здесь третий параметр (адрес текстового файла с куками) должен быть точно таким же, как и при использовании CURLOPT_COOKIEJAR, иначе процедура авторизации работать не будет, так как требуемые серверу Куки не передадутся */
$result = curl_exec($ch);
curl_close($ch);
echo $result;

Запись опубликована в рубрике PHP. Добавьте в закладки постоянную ссылку.

Добавить комментарий