КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

cURL

В PHP включена поддержка libcurl - библиотеки функций, написанной Daniel Stenberg, которая позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов. В настоящее время libcurl поддерживает протоколы http, https, ftp, gopher, telnet, dict, file и ldap. libcurl также умеет работать с сертификатами HTTPS, посылать запросы к HTTP серверам методами POST и PUT, закачивать файлы по протоколам HTTP и FTP (последнее можно сделать с помощью модуля FTP), использовать прокси-серверы, cookies и аутентификацию пользователей.
cURL - мощнейшая библиотека для сетевых запросов, которая существует столько же, сколько и php и имеет привязки во всех операционных системах и языках программирования.

Пример

  $url = $_SERVER['SERVER_NAME'];
  $data = array("url"=>$url);
  $string = http_build_query($data); // генерируем URL-кодированную строку запроса
  $url = "http://web4den2/1.php"; // куда посылаем запрос
  $userAgent = $_SERVER['HTTP_USER_AGENT'];
  
  $ch = curl_init(); // инициализируем сеанс cURL, можно сразу же указать урл запроса ($ch = curl_ini($url); )
  
  curl_setopt($ch, CURLOPT_URL, $url); // куда будет идти запрос
  
  curl_setopt($ch, CURLOPT_POST, true); // метод запроса
  // curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
  
  curl_setopt($ch, CURLOPT_POSTFIELDS, $string); // данные, которые передаются методом POST
  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // говорим о том, что полученные в ответ данные будут записаны в переменную, а не будут просто выводиться на экран  
  
  curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:text/html; charset=UTF-8", "length: 100"));
  
  curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // чтобы сервер не отвечал редиректом
  
  // для загрузки страниц по https, обращения по SSL
  curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

  curl_setopt($ch, CURLOPT_USERAGENT, $userAgent);
  
  curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
  curl_setopt($ch, CURLOPT_TIMEOUT, 120); // задаем масимальное время выполнения операции в секундах
  curl_setopt($ch, CURLOPT_MAXREDIRS, 2); // максимальное количество редиректов, которые может сделать запрашиваемый url
  
  curl_setopt($ch, CURLOPT_HEADER, true); // прочитать заголовки
  curl_setopt($ch, CURLOPT_NOBODY, true); // результат не будет включать документ 
  

  $output = curl_exec($ch);
  if($output === false){
    echo $url . ' ' . curl_error($ch);
  }else{
    echo $output;
  }
  curl_close($ch); // завершаем сессию cURL

Для установки большого количества cURL-параметров без необходимости постоянно вызывать curl_setopt() существует функция curl_setopt_array:
  $options = array(CURLOPT_URL => 'http://www.example.com/',
                   CURLOPT_HEADER => false
                  );

  curl_setopt_array($ch, $options);

Для копирования дескриптора $ch вместе со всеми его настройками используется функция curl_copy_handle():

  $ch2 = curl_copy_handle($ch);


curl_escape — Кодирует заданную строку как URL

  // Экранируем строку, которую хотим передать методом GET
  $location = curl_escape($ch, 'Пакет filesystem');
  // Результат: %D0%9F%D0%B0%D0%BA%D0%B5%D1%82+filesystem

  // Собираем URL по частям
  $url = "http://web4myself.ru/php_javascript/$location";

  curl_setopt($ch, CURLOPT_URL, $url);
  
  // curl_unescape делает обратное, раскодирует строку
  $effective_url_decoded = curl_unescape($ch, $url);

curl_getinfo() Возвращает информацию о последней операции.

  print_r(curl_getInfo($ch));

Передача файлов

  // если функция не существует в нашей версии php:
  if (!function_exists('curl_file_create')) {
    function curl_file_create($filename, $mimetype = '', $postname = '') {
        return "@$filename;filename="
            . ($postname ?: basename($filename))
            . ($mimetype ? ";type=$mimetype" : '');
    }
  }

  $file = curl_file_create(dirname(__FILE__).'/nav.png', 'image/png');

  $ch = curl_init();
  
  // если post-данные передавать массивом, то будет выставлен ещё один заголовок, говорящий, что это multipart/form-data
  $postdata = array('FileToLoad' => new CURLFile(dirname(__FILE__).'/nav.png', 'image/png', 'nav.png'));

  // или
  $postdata = array('FileToLoad' => $file);

  curl_setopt($ch, CURLOPT_URL, 'http://curl/upload.php');
  curl_setopt($ch, CURLOPT_POST, true);
  curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);

  curl_exec($ch);

  /* 
  http://curl/upload.php:
  $uploadfile = __DIR__ . '/node.png';
  if (move_uploaded_file($_FILES['FileToLoad']['tmp_name'], $uploadfile)){
    echo true;
  }
  */

cURL аналог функции file_get_contents()
Функция file_get_contents(), очень удобная, но к несчастью отключена большинством хостингов. Используя cURL, мы можем написать аналог этой функции:
  function file_get_contents_curl($url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
  }

Закачка файлов по ftp

  /* из консоли */
  curl --upload-file cookie.txt ftp://user:password@domain.ru:21/www/domain.ru/
  
  
  
  /* с помощью кУРЛ */
  function curl_upload($ftp_connect, $path, $newPath){
    
    // путь к файлу на сервере
    $path = realpath($path);
    
    $file = fopen($path, "r");
    
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $ftp_connect.$newPath);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // загрузка опций
    curl_setopt($ch, CURLOPT_UPLOAD, true);
     
    curl_setopt($ch, CURLOPT_INFILE, $file);
    curl_setopt($ch, CURLOPT_INFILESIZE, filesize($path));
    // настройка для режима ASCII (например для текстовых файлов)
    curl_setopt($ch, CURLOPT_TRANSFERTEXT, true);
    $output = curl_exec($ch);
    curl_close($ch);
    if ($output === false) {
	    echo "cURL Error: " . curl_error($ch);
      return false;
	  }else{
      echo "Файл передан";
      return true;
    }
  }  
   
  curl_upload("ftp://user:password@domain.ru:21/", "test.php", "www/domain.ru/test.php");


 
  /* С помощью ftp-функций php */
  $file = 'cookie.txt';
  $remote_file = 'www/domain.ru/somefile.php';

  // установка соединения
  $conn_id = ftp_connect("ftp.domain.ru");

  // проверка имени пользователя и пароля
  $login_result = ftp_login($conn_id, "login", "password");

  // загрузка файла, может принимать значения FTP_ASCII или FTP_BINARY. 
  if (ftp_put($conn_id, $remote_file, $file, FTP_ASCII)) {
   echo "$file успешно загружен на сервер\n";
  } else {
   echo "Не удалось загрузить $file на сервер\n";
  }

  // закрытие соединения
  ftp_close($conn_id);

Работа с cookies

Для того, чтобы использовать куки и работать со страницами от имени авторизованного пользователя, в cURL есть пару методов разной степени жестокости. Для полноценной имитации подойдёт такой вот способ::
  require 'vendor/autoload.php';
 
  //$cookies = 'login=sash; curl_session_cookie=1'; // если передавать куки строкой
  
  $cookiefile = __DIR__.'/cookie.txt';
  
  $ch = curl_init('http://myWorks/curl/cookie-test.php');
  
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_HEADER, true);
  curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 6.0; Windows CE; IEMobile 7.7)');
  //curl_setopt($ch, CURLOPT_COOKIE, $cookies); // если передавать куки строкой
  curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiefile); // сохраним установленные куки в файл
  curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiefile);// указываем из какого файла будут браться куки
  curl_setopt($ch, CURLOPT_COOKIESESSION, true); // будут передаваться только нормальные куки, будет имитация новой сессии на сайте
  
  $html = curl_exec($ch);
  curl_close($ch);
  echo "<pre>";
  echo $html;
  
  
  // файл cookie-test.php:
  require 'vendor/autoload.php';

  ob_start();

  $cook = false;

  if(isset($_COOKIE['curl_session_cookie'])){
    $cook = true;
    echo "Сессионная кука есть\n";
  }

  if(isset($_COOKIE['login'])){
    $cook = true;
    echo "Нормальная кука есть\n";
  }

  setcookie('curl_session_cookie', 1);
  setcookie('login', 'sash', time()+11*30*24*3600);

  if($cook){
    echo "Я тебя знаю";
  }else{
    echo "Ты здесь новенький";
  }

  ob_end_flush();

После двух запусков скрипта будет создан cookie.txt с таким примерно содержимым
  # Netscape HTTP Cookie File
  # http://curl.haxx.se/docs/http-cookies.html
  # This file was generated by libcurl! Edit at your own risk.

  myWorks	FALSE	/curl/	FALSE	1524212560	login	sash
  myWorks	FALSE	/curl/	FALSE	0	curl_session_cookie	1

Multi_cURL

Multi_cURL предназначен для "одновременной" (с некоторыми оговорками) обработки множества cURL-запросов. Если вы освоили cURL, то Multi_cURL пойдёт запросто. Все примеры есть в документации
Существуют пакеты, предоставляющие обёртки для cURL-функций, к примеру php-curl-class и более серъёзные инструменты для сетевых запросов, Guzzle и другие. Если это вам будет нужно, изучите углублённо :) На сегодня всё, бай, успехов ;)
2017.05.22 118

— Настоящий программист всегда должен ложиться спать или в 1:28 или в 2:56... Ну, на крайний случай, в 5:12. — А вставать в 10:24. Ну, на крайний случай, в 20:48.
Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


  • Или вообще не ложится нема время на сон, нужно учиться, учиться и ещё раз учиться . Не помню кто сказал

  • 2017.05.23 - 16:29

Яндекс.Метрика Яндекс.Метрика