Php curl

POST запрос¶

Примечание

httpbin — сервис для отладки HTTP запросов и
ответов

Пример POST запроса к сервису httpbin.

POST запрос на сайт https://httpbin.org/post

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  /* In windows, this will init the winsock stuff */
  curl_global_init(CURL_GLOBAL_ALL);

  /* get a curl handle */
  curl = curl_easy_init();
  if(curl) {
    /* First set the URL that is about to receive our POST. This URL can
       just as well be a https:// URL if that is what should receive the
       data. */
    curl_easy_setopt(curl, CURLOPT_URL, "https://httpbin.org/post");
    /* Now specify the POST data */
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=UrFU&project=lectures.www");

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  curl_global_cleanup();
  return ;
}

Ответ в формате JSON

{
  "args" {},
  "data" "",
  "files" {},
  "form" {
    "name" "UrFU",
    "project" "lectures.www"
  },
  "headers" {
    "Accept" "*/*",
    "Content-Length" "30",
    "Content-Type" "application/x-www-form-urlencoded",
    "Host" "httpbin.org"
  },
  "json" null,
  "url" "https://httpbin.org/post"
}

👨‍💻 Опрос

Проверьте свою внимательность. Что означают следующие параметры?

Tip: Использование curl в Терминале или iTerm OS Mac обеспечивают намного более простую работу, чем использование командной строки в Windows. Если серьезно относиться к документации API, работая на ПК, стоит подумать о переходе с OS Windows. Будет много утилит, которые мы установим при помощи Терминала, который просто работает на Mac. Кроме того, находясь в Силиконовой долине, и используя ПК вместо Mac можно показаться старомодным для окружающих (см. Почему большинство стартапов покупают MacBook для своих сотрудников).

Для более подробного изучения curl в документировании REST API можно посмотреть REST-esting with curl.

Загружаем и сохраняем изображения со страницы с помощью cURL

Данная функция может быть очень полезна: задаем ей URL страницы и она сохраняет все изображения с нее на вашем сервере.

function getImages($html) {
    $matches = array();
    $regex = '~http://somedomain.com/images/(.*?)\.jpg~i';
    preg_match_all($regex, $html, $matches);
    foreach ($matches as $img) {
        saveImg($img);
    }
}

function saveImg($name) {
    $url = 'http://somedomain.com/images/'.$name.'.jpg';
    $data = get_data($url);
    file_put_contents('photos/'.$name.'.jpg', $data);
}

$i = 1;
$l = 101;

while ($i < $l) {
    $html = get_data('http://somedomain.com/id/'.$i.'/');
    getImages($html);
    $i += 1;
}

Библиотеки

Чтобы не создавать новый велосипед, лучше всего воспользоваться готовым решением в виде Guzzle.

Я вкратце опишу что это и с чем его едят:

Guzzle был создан для того, чтобы упростить процесс отправки HTTP запросов. Зачастую используется для отправки запросов к API и чему угодно в целом.

Реальный пример:

Вы можете спросить: Зачем это нужно, если уже существует куча библиотек? 

Guzzle собрал все самое лучшее в себе, сделать это еще лучше и теперь это самая популярная PHP библиотека для работы с HTTP запросами. Она и вправду крутая, посмотрите только на простоту запроса:

// Создается клиент с базовой URI
$client = new GuzzleHttp\Client(['base_uri' => 'http://bologer.ru/']);
// Теперь вы можете отправить запрос на http://bologe.ru/about-blog, информацю о моем блоге :)
$response = $client->request('GET', 'about-blog');
// Также можно отправить на http://bologer.ru/about, чтобы прочитать обо мне. Guzzle запоминает базовую ссылку и теперь вы можете указывать лишь последующие страницы для удобства
$response = $client->request('GET', 'about');

Круто? Мне очень нравится.

Отправка cURL запроса PHP

Формирование cURL запроса состоит из четырех этапов:

  1. Инициализация
  2. Указание параметров
  3. Выполнение команды и получение результата
  4. Освобождение памяти

Итак, как это должно выглядеть в коде:

// 1. Инициализация
$ch = curl_init();

// 2. Указание параметров
curl_setopt($ch, CURLOPT_URL, "https://asgeto.ru");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);

// 3. Выполнение команды и получение результата
$output = curl_exec($ch);
// В случае возникновения ошибки выводит её в документ
if ($output === FALSE) {
echo "cURL Error: " . curl_error($ch); // можно заменить на логирование в файл при желании
}

// 4. Освобождение памяти
curl_close($ch);

Получение информации

Ещё одним дополнительным шагом является получение данных о cURL запросе, после того, как он был выполнен.

// ...

curl_exec($ch);

$info = curl_getinfo($ch);

echo 'Took ' . $info . ' seconds for url ' . $info;

// …

Возвращаемый массив содержит следующую информацию:

  • “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”

Получить HTTP код ответа сервера

Если требуется прощупать доступность сайта или его отдельной страницы, то можно воспользоваться функцией curl_getinfo с параметром CURLINFO_HTTP_CODE:

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

echo $http_code; // Выведет: 200

Используя объемный арсенал возможностей, которые предоставляют запросы cURL в php, можно решить широкий круг задач, требующих использование кроссплатформенных запросов для выполнения действий или обмена данными между разными сайтами.

Предыдущая запись Передача метрики на другой аккаунт при смене владельца сайта

Технология cURL

cURL — это технология, которая предназначена для передачи/получения данных посредстов URL. Технология cURL поддерживает такие распространенные протоколы, как HTTP, FTP, HTTPs и другие. Изначально cURL был инструментом командной строки, однако разработчики PHP не поленились и создали библиотеку в PHP, чем облегчили жизнь миллионам программистам. Давайте попробуем вместе разобраться с технологией cURL на примерах. Советую читать всё и по порядку.

Я знаю достаточно много примеров, где для получения сторонних web-страниц (парсеры) использовались совершенно другие способы, отличные от cURL. Например:

  • file_get_contents(«https://intop24.ru»);
  • file(«https://intop24.ru»);
  • readfile(«https://intop24.ru»);

Почему разработчики использовали их и что в них не так? А потому, что не знали, либо не хотели знать, что такое cURL. А не так в них то, что функционал ограничен: получили страницу и все на этом, в то время, как cURL может отправить форму на странице, получить ответ, обработать ошибку, начать всё заново и т.д.

POST и GET запросы без cURL

С помощью PHP мы можем отправить простой GET запрос используя функцию file_get_contents.

Пример:

$result = file_get_contents('https://phpstack.ru/');

Теперь у нас в переменной $result записан весь html код главной страницы этого сайта.
Мы совершили GET запрос, а html код — это ответ на него.

При помощи file_get_contents мы также можем отправить POST запрос.

Пример:

$postData = http_build_query();

$opts = [
    'http' => [
        'method' => 'POST',
        'header' => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postData
    ]
];

$context = stream_context_create($opts);

$result = file_get_contents('https://httpbin.org/anything', false, $context);

Подробнее о том, какие опции можно передавать в stream_context_create, вы можете изучить здесь: http://docs.php.net/manual/ru/context.http.php

В $result мы получили ответ на POST запрос. httpbin.org — это сторонний сервис, который вы можете использовать для отладки запросов. Он возвращает нам наш собственный запрос в формате JSON и еще некоторую информацию. Так мы можем увидеть, что мы отправляем в своих запросах.

Как видите file_get_contents — полезная функция, которая не только позволяет читать файлы на нашем сервере, но еще и отправлять запросы.

Подробнее о ней вы можете прочитать здесь: https://www.php.net/manual/ru/function.file-get-contents.php

Команды Curl для HTTP

Curl также можно использовать c прокси-сервером. Если вы находитесь за прокси-сервером, прослушивающим порт 8090 на sampleproxy.com, загрузите файлы, как показано ниже:

curl -x  sampleproxy.com:8090 -U username:password -O http:// testdomain.com/testfile.tar.gz

В приведённом выше примере вы можете выбросить -U username:password, если прокси-сервер не требует метода аутентификации.

Типичный HTTP-запрос всегда содержит заголовок. Заголовок HTTP отправляет дополнительную информацию об удалённом веб-сервере вместе с фактическим запросом. С помощью инструментов разработчика в браузере вы можете посмотреть сведения о заголовке, а проверить их можно с помощью команды curl.

Пример ниже демонстрирует, как получить информацию о заголовке с веб-сайта.

curl -I www.testdomain.com

Используя curl, вы можете сделать запрос GET и POST. Запрос GET будет выглядеть следующим образом:

curl http://mydomain.com

А вот пример запроса POST:

curl –data “text=Hello” https://myDomain.com/firstPage.jsp

Здесь text=Hello — это параметр запроса POST. Такое поведение похоже на HTML-формы.

Вы также можете указать несколько методов HTTP в одной команде curl. Сделайте это, используя опцию –next, например:

curl –data “text=Hello” https://myDomain.com/firstPage.jsp –next https://myDomain.com/displayResult.jsp

Команда содержит запрос POST, за которым следует запрос GET.

Каждый HTTP-запрос содержит агент пользователя, который отправляется как часть запроса. Он указывает информацию о браузере клиента. По умолчанию запрос содержит curl и номер версии в качестве информации об агенте пользователя. Пример вывода показан ниже:

“GET / HTTP/1.1” 200 “_” ”curl/7/29/0”

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

curl -I http://mydomain.com –-user-agent “My new Browser”

Теперь вывод будет выглядеть так:

“GET / HTTP/1.1” 200 “_” ”My new Browser”

Получаем последний статус Twitter

С помощью PHP и cURL очень просто получить статус определённого пользователя. Данную информацию можно выводить в блоге.

function get_status($twitter_id, $hyperlinks = true) {
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, "http://twitter.com/statuses/user_timeline/$twitter_id.xml?count=1");
    curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
    $src = curl_exec($c);
    curl_close($c);
    preg_match('/<text>(.*)<\/text>/', $src, $m);
    $status = htmlentities($m);
    if( $hyperlinks ) $status = ereg_replace("]+://]+/]", '<a href="%5C%22%5C%5C0%5C%22">\\0</a>', $status);
    return($status);
}

Использовать функцию очень просто:

echo get_status('catswhocode');

Метод POST

Метод GET приводит к тому, что вся введенная информация отображается в адресной строке браузера. Очевидно, что это не самый лучший способ в тех случаях, когда нужно отправить конфиденциальные данные или когда объем введенной информации очень велик. Для решения этой проблемы протокол HTTP предоставляет пользователю еще один метод — POST. С его помощью клиент отправляет данные отдельно от URL, и поэтому в адресной строке браузера вы их не увидите.

Форма, генерирующая POST-запрос, отличается от предыдущей лишь методом отправки:

 <form method="POST" action="foo.cgi">
 <input type=text name="year">
 <input type=submit name=press value=" OK ">
 </form>

curl сформирует POST-запрос с теми же данными следующим образом:

$ curl -d "year=1990&press=%20OK%20" www.foo.com/foo.cgi

Обратите внимание на то, что данные, которые вы отправляете серверу, должны быть правильно закодированы. curl не сделает этого за вас

К примеру, если вы хотите, чтобы данные содержали пробел, то вам нужно заменить этот пробел на и т. п. Это одна из самых распространенных ошибок, в результате чего данные передаются не так, как нужно.

5 последних уроков рубрики «PHP»

Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак

В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение

В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

Следовать за редиректами

Сервер Google сообщил нам, что страница перемещена (301 Moved Permanently), и теперь надо запрашивать страницу . С помощью опции укажем CURL следовать редиректам:

> curl -L google.com
<!doctype html>
<html itemscope="" itemtype="http://schema.org/WebPage" lang="ru">
<head>
<meta content="Поиск информации в интернете: веб страницы, картинки, видео и многое другое." name="description">
<meta content="noodp" name="robots">
<meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image">
<meta content="origin" name="referrer">
<title>Google</title>
..........

Команда curl

Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Синтаксис утилиты очень прост:

$ curlопции ссылка

Теперь рассмотрим основные опции:

  • -# – отображать простой прогресс-бар во время загрузки;
  • -0 – использовать протокол http 1.0;
  • -1 – использовать протокол шифрования tlsv1;
  • -2 – использовать sslv2;
  • -3 – использовать sslv3;
  • -4 – использовать ipv4;
  • -6 – использовать ipv6;
  • -A – указать свой USER_AGENT;
  • -b – сохранить Cookie в файл;
  • -c – отправить Cookie на сервер из файла;
  • -C – продолжить загрузку файла с места разрыва или указанного смещения;
  • -m – максимальное время ожидания ответа от сервера;
  • -d – отправить данные методом POST;
  • -D – сохранить заголовки, возвращенные сервером в файл;
  • -e – задать поле Referer-uri, указывает с какого сайта пришел пользователь;
  • -E – использовать внешний сертификат SSL;
  • -f – не выводить сообщения об ошибках;
  • -F – отправить данные в виде формы;
  • -G – если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
  • -H – передать заголовки на сервер;
  • -I – получать только HTTP заголовок, а все содержимое страницы игнорировать;
  • -j – прочитать и отправить cookie из файла;
  • -J – удалить заголовок из запроса;
  • -L – принимать и обрабатывать перенаправления;
  • -s – максимальное количество перенаправлений с помощью Location;
  • -o – выводить контент страницы в файл;
  • -O – сохранять контент в файл с именем страницы или файла на сервере;
  • -p – использовать прокси;
  • –proto – указать протокол, который нужно использовать;
  • -R –  сохранять время последнего изменения удаленного файла;
  • -s – выводить минимум информации об ошибках;
  • -S – выводить сообщения об ошибках;
  • -T – загрузить файл на сервер;
  • -v – максимально подробный вывод;
  • -y – минимальная скорость загрузки;
  • -Y – максимальная скорость загрузки;
  • -z – скачать файл, только если он был модифицирован позже указанного времени;
  • -V – вывести версию.

Это далеко не все параметры curl linux, но здесь перечислено все основное, что вам придется использовать.

Команда curl

Перед тем как перейти к описанию того как может использоваться команда curl linux, давайте разберем саму утилиту и ее основные опции, которые нам понадобятся. Синтаксис утилиты очень прост:

$ curl опции ссылка

Теперь рассмотрим основные опции:

  • -# — отображать простой прогресс-бар во время загрузки;
  • -0 — использовать протокол http 1.0;
  • -1 — использовать протокол шифрования tlsv1;
  • -2 — использовать sslv2;
  • -3 — использовать sslv3;
  • -4 — использовать ipv4;
  • -6 — использовать ipv6;
  • -A — указать свой USER_AGENT;
  • -b — сохранить Cookie в файл;
  • -c — отправить Cookie на сервер из файла;
  • -C — продолжить загрузку файла с места разрыва или указанного смещения;
  • -m — максимальное время ожидания ответа от сервера;
  • -d — отправить данные методом POST;
  • -D — сохранить заголовки, возвращенные сервером в файл;
  • -e — задать поле Referer-uri, указывает с какого сайта пришел пользователь;
  • -E — использовать внешний сертификат SSL;
  • -f — не выводить сообщения об ошибках;
  • -F — отправить данные в виде формы;
  • -G — если эта опция включена, то все данные, указанные в опции -d будут передаваться методом GET;
  • -H — передать заголовки на сервер;
  • -I — получать только HTTP заголовок, а все содержимое страницы игнорировать;
  • -j — прочитать и отправить cookie из файла;
  • -J — удалить заголовок из запроса;
  • -L — принимать и обрабатывать перенаправления;
  • -s — максимальное количество перенаправлений с помощью Location;
  • -o — выводить контент страницы в файл;
  • -O — сохранять контент в файл с именем страницы или файла на сервере;
  • -p — использовать прокси;
  • —proto — указать протокол, который нужно использовать;
  • -R —  сохранять время последнего изменения удаленного файла;
  • -s — выводить минимум информации об ошибках;
  • -S — выводить сообщения об ошибках;
  • -T — загрузить файл на сервер;
  • -v — максимально подробный вывод;
  • -y — минимальная скорость загрузки;
  • -Y — максимальная скорость загрузки;
  • -z — скачать файл, только если он был модифицирован позже указанного времени;
  • -V — вывести версию.

Это далеко не все параметры curl linux, но здесь перечислено все основное, что вам придется использовать.

Используем curl для получения веб-страницы

Как упоминалось ранее, одна из причин, по которой API REST настолько знакомы, заключается в том, что REST следует той же модели, что и веб (см. Что такое REST API?). При вводе http-адреса в адресную строку браузера мы говорим браузеру сделать HTTP-запрос к ресурсу на сервере. Сервер возвращает ответ, а наш браузер преобразует ответ в более визуальное отображение. Но мы также можем увидеть и сырой код.

Чтобы увидеть пример того, как curl извлекает веб-ресурс, откройте терминал и введите следующее:

Curl извлечет HTML-код для сайта example.com. Задача браузера — сделать этот код визуально читаемым. curl показывает, что мы на самом деле получаем.

Получаем информацию о размере файла с помощью cURL

Как определить размер определенного файла, расположенного на другом сервере? Поможет следующая функция. Она получает 3 параметра: URL файла, и (если требуется) имя пользователя и пароль.

function remote_filesize($url, $user = "", $pw = ""){
    ob_start();
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_HEADER, 1);
    curl_setopt($ch, CURLOPT_NOBODY, 1);

    if(!empty($user) && !empty($pw))
    {
        $headers = array('Authorization: Basic ' .  base64_encode("$user:$pw"));
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }

    $ok = curl_exec($ch);
    curl_close($ch);
    $head = ob_get_contents();
    ob_end_clean();

    $regex = '/Content-Length:\s(.+?)\s/';
    $count = preg_match($regex, $head, $matches);

    return isset($matches) ? $matches : "unknown";
}

Пример работы с библиотекой

Я считаю, что после того, как некоторые общие моменты уже ясны и вроде бы все понятно, то самое время переходить к практике и на примере уже оттачивать свое мастерство. Лично у меня всегда сразу руки чешутся все попробовать на практике 🙂

Раз уж cURL так хорош для парсеров, то рассмотрим функцию получения кода страницы по ее адресу. При этом на выходе получим массив с заголовком, содержимым страницы и даже коды ошибок, если что-то пойдет не так.
Входные параметры:url — адрес страницы или сайта.
Значения выходных параметров (массив с тремя элементами):header — если что-то пошло не так, то тут будет код ошибки.header — здесь при этом будет текст ошибки.header — собственно сама страница\файл\картинка и т.д.

Используем функцию, например, так:

$result = get_web_page( "https://ya.ru" );
if (($result != 0 )||($result != 200))
    {
	echo $result;
	}
else
	{
	$page = $result;
	echo $page;
	}

Все должно пройти без ошибок и вы получите код страницы в переменной $page. Если же попробовать получить несуществующую страницу , то получим ошибку:

Could not resolve host: yaaaaaaaaaaaa.ru; Host not found

Все обрабатывается корректно и красиво 🙂
Дальше с кодом страницы можно делать все что угодно, например, парсить регулярками. Но это все в следующих уроках, а пока что остановимся на этом.

← PHP — str_replace | | Парсер статистики Liveinternet →

Формы

Формы — основной способ представления web-сайта как HTML-страницы
с полями, в которые пользователь вводит данные, и затем нажимает на
кнопку ‘OK’ или ‘Отправить’, после чего данные отсылаются на сервер.
Затем сервер использует принятые данные и решает, как действовать
дальше: искать информацию в базе данных, показать введенный адрес на
карте, добавить сообщение об ошибке или использовать информацию для
аутентификации пользователя. Разумеется, на стороне сервера имеется
какая-то программа, которая принимает ваши данные.

4.1 GET

GET-форма использует метод GET, например следующим образом:

        <form method="GET" action="junk.cgi">
        <input type=text name="birthyear">
        <input type=submit name=press value="OK">
        </form>

Если вы откроете этот код в вашем браузере, вы увидите форму с
текстовым полем и кнопку с надписью «OK». Если вы введете
‘1905’ и нажмете OK, браузер создаст новый URL, по которому и
проследует. URL будет представляться строкой, состоящей из пути
предыдущего URL и строки, подобной
«junk.cgi?birthyear=1905&press=OK».

Например, если форма располагалась по адресу
«www.hotmail.com/when/birth.html», то при нажатии на кнопку
OK вы попадете на URL
«www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK».

Большинство поисковых систем работают таким образом.

Чтобы curl сформировал GET-запрос, просто введите то, что
ожидалось от формы:

        # curl "www.hotmail.com/when/junk.cgi?birthyear=1905&press=OK"

4.2 POST

Метод GET приводит к тому, что вся введенная информация
отображается в адресной строке вашего браузера. Может быть это
хорошо, когда вам нужно добавить страницу в закладки, но это
очевидный недостаток, когда вы вводите в поля формы секретную
информацию, либо когда объем информации, вводимый в поля, слишком
велик (что приводит к нечитаемому URL).

Протокол HTTP предоставляет метод POST. С помощью него клиент
отправляет данные отдельно от URL и поэтому вы не увидете их в
адресной строке.

Форма, генерирующая POST-запрос, похожа на предыдущую:

        <form method="POST" action="junk.cgi">
        <input type=text name="birthyear">
        <input type=submit name=press value=" OK ">
        </form>

Curl может сформировать POST-запрос с теми же данными следующим
образом:

        # curl -d "birthyear=1905&press=%20OK%20" www.hotmail.com/when/junk.cgi

Этот POST-запрос использует ‘Content-Type
application/x-www-form-urlencoded’, это самый широко используемый
способ.

Данные, которые вы отправляете к серверу, должны быть правильно
закодированы
, curl не будет делать это за вас. К примеру, если вы
хотите, чтобы данные содержали пробел, вам нужно заменить этот пробел
на %20 и т.п. Недостаток внимания к этому вопросу — частая ошибка,
из-за чего данные передаются не так, как надо.

4.3 Загрузка файлов с помощью POST (File Upload POST)

В далеком 1995 был определен дополнительный способ передавать
данные по HTTP. Он задокументирован в RFC 1867, поэтому этот способ
иногда называют RFC1867-posting.

Этот метод в основном разработан для лучшей поддержки загрузки
файлов. Форма, которая позволяет пользователю загрузить файл,
выглядит на HTML примерно следующим образом:

        <form method="POST" enctype='multipart/form-data' action="upload.cgi">
        <input type=file name=upload>
        <input type=submit name=press value="OK">
        </form>

Заметьте, что тип содержимого Content-Type установлен в
multipart/form-data.

Чтобы отослать данные в такую форму с помощью curl, введите
команду:

        # curl -F upload=@localfilename -F press=OK 

4.4 Скрытые поля

Обычный способ для передачи информации о состоянии в
HTML-приложениях — использование скрытых полей в формах. Скрытые поля
не заполняются, они невидимы для пользователя и передаются так же,
как и обычные поля.

Простой пример формы с одним видимым полем, одним скрытым и
кнопкой ОК:

        <form method="POST" action="foobar.cgi">
        <input type=text name="birthyear">
        <input type=hidden name="person" value="daniel">
        <input type=submit name="press" value="OK">
        </form>

Чтобы отправить POST-запрос с помощью curl, вам не нужно думать о
том, скрытое поле или нет. Для curl они все одинаковы:

        # curl -d "birthyear=1905&press=OK&person=daniel" 

4.5 Узнать, как выглядит POST-запрос

Когда вы хотите заполнить форму и отослать данные на сервер с
помощью curl, вы наверняка хотите, чтобы POST-запрос выглядел точно
также, как и выполненный с помощью браузера.

Простой способ увидеть свой POST-запрос, это сохранить
HTML-страницу с формой на диск, изменить метод на GET, и нажать
кнопку ‘Отправить’ (вы можете также изменить URL, которому будет
передаваться данные).

Вы увидите, что данные присоединились к URL, отделенные символами
‘?’, как и предполагается при использовании GET-форм.

Загрузка файла

Загрузка файла будет выглядеть практически так же, как и обычный POST запрос, так как все формы загрузки файла работают только с ним.

Сначала давайте создадим файл для того, чтобы сформировать его и отправить файлу upload_output.php:

print_r($_FILES);

А вот и код скрипта, который выполняет указанный выше функционал:

$url = "http://localhost/upload_output.php";

$post_data = array (
    "foo" => "bar",
    // файл, который необходимо загрузить
    "upload" => "@C:/wamp/www/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;

Когда вы хотите загрузить файл, все, что вам нужно сделать, так это передать его как обычную post переменную, предварительно поместив перед ней символ @. При запуске написанного скрипта вы получите следующий результат:

POST запросы cUrl в PHP

$array = array(
'login' => 'user',
'password' => '123'
);

$ch = curl_init('https://asgeto.ru');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $array);

// Или предать массив строкой:
// curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($array, '', '&'));

curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

Функция file_get_contents() так же умеет отправлять POST запросы. Для этого нужно использовать заголовки:

$headers = stream_context_create(array(
'http' => array(
'method' => 'POST',
'header' => 'Content-Type: application/x-www-form-urlencoded' . PHP_EOL,
'content' => 'login=user&password=123',
),
));

echo file_get_contents('https://asgeto.ru', false, $headers);

Получить содержимое страницы (GET)

Самый простой и обычный HTTP-запрос — получить содержимое заданного URL. URL может ссылаться на веб-страницу, изображение или какой либо-другой файл. Клиент отсылает GET-запрос на сервер и получает запрашиваемый документ. Если выполнить команду

$ curl http://curl.haxx.se

вы получите веб-страницу, выведенную в окно терминала (точнее, в стандартный вывод). Чтобы сохранить эту страницу в файл , нужно указать

$ curl http://curl.haxx.se -o "curl.html"

Все HTTP-ответы содержат набор заголовков, которые обычно скрыты. Чтобы увидеть эти заголовки вместе с самим документом, используйте ключ .

Параллельные cURL запросы в PHP

Для чего могут потребоваться многопоточные запросы? Например у нас есть много URL адресов:

$urls = [
    'https://httpbin.org/anything?1',
    'https://httpbin.org/anything?2',
    'https://httpbin.org/anything?3',
];

И если мы будем по очереди отправлять запросы, то второй запрос начнется только после того, как закончился первый и так далее, а это существенно увеличивает время работы скрипта.

Выглядит это так:

$results = [];
foreach ($urls as $url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, false);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $results = curl_exec($ch);
    curl_close($ch);
}

var_dump($results);

Теперь в $results у нас содержится массив, где ключи — это url адреса, а значения — результаты запросов. Однако запросы выполняются долго. Но мы можем это ускорить.

Как выполнить 3 запроса одновременно? В этом нам поможет

Давайте решим конкретную задачу при помощи параллельных curl запросов. Нам нужно отправить одновременно 3 запроса.

$urls = [
    'https://httpbin.org/anything?1',
    'https://httpbin.org/anything?2',
    'https://httpbin.org/anything?3',
];


// array of curl handles
$multiCurl = [];
// data to be returned
$results = [];
// multi handle
$mh = curl_multi_init();
foreach ($urls as $url) {
    $multiCurl = curl_init();
    curl_setopt($multiCurl, CURLOPT_URL, $url);
    curl_setopt($multiCurl, CURLOPT_HEADER, 0);
    curl_setopt($multiCurl, CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $multiCurl);
}
$index = null;
do {
    curl_multi_exec($mh, $index);
} while ($index > 0);
// get content and remove handles
foreach ($multiCurl as $k => $ch) {
    $results = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
}
// close
curl_multi_close($mh);

var_dump($results); // в $results у нас содержатся ответы на наши 3 запроса

Такие параллельные запросы выполняются значительно быстрее чем поочередные.

Заключение

В этом примере я показал, как использовать в PHP-скриптах библиотеку Curl для создания запросов GET и POST, которые должны обрабатываться по-разному. Кроме этого мы разработали класс для более упорядоченной обработки Curl с помощью чистого и гибкого кода. Он позволяет повторно использовать уже открытые сессии для повышения производительности.

6. Скачайте исходный код

Это был пример использования Curl в PHP. Вы можете скачать его исходный код.

Пожалуйста, оставьте свои отзывы по текущей теме статьи. Мы очень благодарим вас за ваши комментарии, дизлайки, подписки, отклики, лайки!

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector