Оглавление

25.10.1. Использование библиотеки CURL

Вместо перечисленных функций для получения информации из сети Интернет можно  воспользоваться  библиотекой CURL  (Client URL Library). Чтобы использовать библиотеку CURL, необходимо  в файле php.ini убрать символ комментария (;) перед строкой
;extension=php_curl.dll

 
В библиотеку CURL входят следующие функции:
□ curl_init([<URL-адрес>]) создает новый сеанс и возвращает идентификатор;
□ curl_close(<Идентификатор>) завершает сеанс;
□ curl_setopt(<Идентификатор>, <Параметр>, <Значение>) устанавливает параметры сеанса.
<Параметр> может равняться одной из следующих констант, определяющих смысл параметра <Значение>:
•  CURLOPT_URL — URL-адрес;
•  CURLOPT_PORT — номер порта;
•  CURLOPT_USERAGENT — значение HTTP-заголовка User-Agent;
•  CURLOPT_RETURNTRANSFER —  если параметр не равен 0, то функция curl_exec()  будет  возвращать  результат,  а  не  выводить  его  сразу  в Web-браузер;
•  CURLOPT_TIMEOUT —  максимальное  время  выполнения  операции (в секундах);
•  CURLOPT_HEADER —  если  параметр  не  равен 0,  то  результат  будет включать  не  только  содержимое  документа,  но  и  заголовки  ответа сервера;
•  CURLOPT_NOBODY —  если  параметр  не  равен 0,  то  результат  будет включать только заголовки ответа сервера;
•  CURLOPT_POST — если параметр не равен 0, то запрос будет оправлен методом POST. Кроме того, будет добавлен HTTP-заголовок Content-Type  со  значением  application/x-www-form-urlencoded.  Этот  заголовок обычно используется при передаче данных формы;
•  CURLOPT_POSTFIELDS — строка, содержащая данные для передачи методом POST;
•  CURLOPT_REFERER — значение HTTP-заголовка Referer;
•  CURLOPT_COOKIE — значение HTTP-заголовка Cookie;
•  CURLOPT_FOLLOWLOCATION — если параметр не равен 0, то перенаправления будут обрабатываться автоматически;
•  CURLOPT_HTTPHEADER —  массив  с  дополнительными HTTP-заголовками;
•  CURLOPT_FILE — дескриптор файла, в который будет выведен результат операции;
•  CURLOPT_WRITEHEADER — дескриптор файла, в который будут выведены полученные заголовки;
•  CURLOPT_STDERR —  дескриптор  файла,  в  который  будут  выводиться сообщения об ошибках;
□ curl_exec(<Идентификатор>) выполняет запрос;
□ curl_getinfo(<Идентификатор>, [<Параметр>])  возвращает  информацию о последней операции. Если <Параметр> не указан, то функция возвращает  ассоциативный  массив.  Если  <Параметр>  равен
CURLINFO_HTTP_CODE, то функция возвращает последний полученный код HTTP. Если  <Параметр>  равен  CURLINFO_CONTENT_TYPE,  то функция  возвращает  содержимое полученного  заголовка Content-Type или  значение NULL, если заголовка нет в ответе сервера;
□ curl_errno(<Идентификатор>) возвращает код последней ошибки;
□ curl_error(<Идентификатор>)  позволяет  получить  строку  с  описанием последней ошибки.
Пример  запроса методом  GET  с  получением  содержимого  документа  и  всех заголовков ответа сервера приведен в листинге 54.

 
Листинг 54. Получение документа методом GET с использованием библиотеки CURL

<?php
$url = "http://wwwadmin.ru/testrobots.php?var1=1&var2=5&var3=45";
@$curl=curl_init();
if (!curl_errno($curl)) {
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_USERAGENT, "MySpider/1.0");
   curl_setopt($curl, CURLOPT_HEADER, 1);
   $headers = array(
      "Accept: text/html, text/plain, application/xml",
      "Accept-Language: ru, ru-RU",
      "Accept-Charset: windows-1251",
      "Accept-Encoding: identity",
      "Connection: close",
      "Cookie: test=5"
   );
   curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   $content = curl_exec($curl);
   if (!curl_errno($curl)) {
      echo "<b>Код возврата:</b> ";
      echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
      echo "<br><b>Заголовок Content-Type:</b> ";
      echo curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
      echo "<br><br>";
      echo "<b>Содержимое страницы:</b><br><br>";
      echo "<pre>" . htmlspecialchars($content) . "</pre>";
   }
   else {
      echo "Произошла ошибка " . curl_errno($curl) . ": ";
      echo curl_error($curl);
   }
   curl_close($curl);
}
else {
   echo "Произошла ошибка " . curl_errno($curl) . ": ";
   echo curl_error($curl);
}
?>

 

В  ряде  случаев  достаточно  получить  только  заголовки  ответа  сервера (листинг 55).

 
Листинг 55. Получение заголовков ответа с использованием библиотеки CURL

<?php
$url = "http://wwwadmin.ru/testrobots.php?var1=1&var2=5&var3=45";
@$curl=curl_init();
if (!curl_errno($curl)) {
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_USERAGENT, "MySpider/1.0");
   curl_setopt($curl, CURLOPT_HEADER, 1);
   curl_setopt($curl, CURLOPT_NOBODY, 1);
   $headers = array(
      "Accept: text/html, text/plain, application/xml",
      "Accept-Language: ru, ru-RU",
      "Accept-Charset: windows-1251",
      "Accept-Encoding: identity",
      "Connection: close",
      "Cookie: test=5"
   );
   curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   $content = curl_exec($curl);
   if (!curl_errno($curl)) {
      echo "<b>Код возврата:</b> ";
      echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
      echo "<br><b>Заголовок Content-Type:</b> ";
      echo curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
      echo "<br><br>";
      echo "<b>Заголовки ответа сервера:</b><br><br>";
      echo "<pre>" . htmlspecialchars($content) . "</pre>";
   }
   else {
      echo "Произошла ошибка " . curl_errno($curl) . ": ";
      echo curl_error($curl);
   }
   curl_close($curl);
}
else {
   echo "Произошла ошибка " . curl_errno($curl) . ": ";
   echo curl_error($curl);
}
?>

 

Приведем  также  пример  запроса  методом  POST,  в  котором  мы  не  получаем заголовки ответа сервера, а только выводим содержимое страницы (листинг 56).

 
Листинг 56. Передача данных методом POST с использованием библиотеки CURL

<?php
$url = "http://wwwadmin.ru/testrobots.php";
@$curl=curl_init();
if (!curl_errno($curl)) {
   curl_setopt($curl, CURLOPT_URL, $url);
   curl_setopt($curl, CURLOPT_USERAGENT, "MySpider/1.0");
   curl_setopt($curl, CURLOPT_HEADER, 0);
   $headers = array(
      "Accept: text/html, text/plain, application/xml",
      "Accept-Language: ru, ru-RU",
      "Accept-Charset: windows-1251",
      "Accept-Encoding: identity",
      "Connection: close",
      "Cookie: test=5"
   );
   curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
   curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
   curl_setopt($curl, CURLOPT_POST, 1);
   curl_setopt($curl, CURLOPT_POSTFIELDS, "var1=1&var2=5&var3=45");
   $content = curl_exec($curl);
   if (!curl_errno($curl)) {
      echo "<b>Код возврата:</b> ";
      echo curl_getinfo($curl, CURLINFO_HTTP_CODE);
      echo "<br><b>Заголовок Content-Type:</b> ";
      echo curl_getinfo($curl, CURLINFO_CONTENT_TYPE);
      echo "<br><br>";
      echo "<b>Содержимое страницы:</b><br><br>";
      echo "<pre>" . htmlspecialchars($content) . "</pre>";
   }
   else {
      echo "Произошла ошибка " . curl_errno($curl) . ": ";
      echo curl_error($curl);
   }
   curl_close($curl);
}
else {
   echo "Произошла ошибка " . curl_errno($curl) . ": ";
   echo curl_error($curl);
}
?>
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити