Как создать get post запросы с помощью php

Curl и FTP

Утилита поддерживает FTP! Вы можете использовать её для загрузки файлов с удалённого сервера.

curl -u username:password -O ftp://sampleftpserver/testfile.tar.gz

В приведённой выше команде ftp://sampleftpserver — это FTP-сервер, который принимает соединения. Вы можете не указывать имя пользователя и пароль для анонимных FTP-соединений. Введите команду и посмотрите, как заполняется индикатор выполнения.

Вы также можете загружать файлы с помощью этой команды:

curl -u username:password -T testfile.tar.gz ftp://sampleftpserver

Опять же таки, мы можем пропустить имя пользователя и пароль для анонимных FTP-соединений.

Имитация браузера через запросы cURL в PHP

Многие сайты защищаются от парсинга, отслеживая данные переменных user agent, referer, cookie. На сервере проверяются эти данные и, если подозрений на парсинг нет, то возвращается страница сайта.

Так как запросы curl в php данные этих переменных не передают, то такая защита от парсинга сайта вернет ошибку 404 или 500. Чтобы этого не происходило, можно сымитировать запрос страницы из браузера, добавив, например, следующие заголовки:

$headers = array(
'cache-control: max-age=0',
'upgrade-insecure-requests: 1',
'user-agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.97 Safari/537.36',
'sec-fetch-user: ?1',
'accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3',
'x-compress: null',
'sec-fetch-site: none',
'sec-fetch-mode: navigate',
'accept-encoding: deflate, br',
'accept-language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
);

$ch = curl_init('http://yandex.ru');
curl_setopt($ch, CURLOPT_COOKIEFILE, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, __DIR__ . '/cookie.txt');
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, true);
$html = curl_exec($ch);
curl_close($ch);

echo $html;

Можно посмотреть через панель для разработчиков заголовки, которые передает браузер при обращение к страницам сайтов и использовать их для запроса cURL в PHP.

Как получать данные отправленные методом POST

методом POSTметода post

Приступим к обработке переданных данных, нам нужно условие, по которому будем проверять, отправлен ли «post запрос» — это условие , после него пишем двойные круглые скобки «()» и помещаем туда название атрибута «name из формы» — рассмотрим это на одном из полей input:

  <input type=»text» name=»login»>

Для данного поля условие получения данных будет таким:

if($_POST)

После круглых скобок ставим фигурные «{}» и внутри них, ну, давайте, передадим полученные данные в переменную $login + не забываем про безопасность strip_tags:

{$login = strip_tags($_POST);}

Полностью можем собрать получение пост запроса из этого input-a :

if($_POST){$login = strip_tags($_POST);}

Тоже самое делаем со вторым полем ввода:

if($_POST){$pass= strip_tags($_POST);}

Обращаю ваше внимание!

Мы рассмотрели два поля ввода!

Но ведь у нас есть кнопка отправить!

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

Это будет проверка на отправку данных, т.е. была ли нажата кнопка submit:

<?

if($_POST)

{

  if($_POST){$login = strip_tags($_POST);}

  if($_POST){$pass= strip_tags($_POST);}

}

?>

методом post

Как пользоваться curl?

Мы рассмотрели все, что касается теории работы с утилитой curl, теперь пришло время перейти к практике, и рассмотреть примеры команды curl.

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

Самая частая задача — это загрузка файлов linux. Скачать файл очень просто. Для этого достаточно передать утилите в параметрах имя файла или html страницы:

Но тут вас ждет одна неожиданность, все содержимое файла будет отправлено на стандартный вывод. Чтобы записать его в какой-либо файл используйте:

А если вы хотите, чтобы полученный файл назывался так же, как и файл на сервере, используйте опцию -O:

Если загрузка была неожиданно прервана, вы можете ее возобновить:

Если нужно, одной командой можно скачать несколько файлов:

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

Данная команда скачает файл, только если он был изменен после 21 декабря 2017.

Ограничение скорости

Вы можете ограничить скорость загрузки до необходимого предела, чтобы не перегружать сеть с помощью опции -Y:

Здесь нужно указать количество килобайт в секунду, которые можно загружать. Также вы можете разорвать соединение если скорости недостаточно, для этого используйте опцию -Y:

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

Загрузка файлов, это достаточно просто, но утилита позволяет выполнять и другие действия, например, отправку файлов на ftp сервер. Для этого существует опция -T:

Или проверим отправку файла по HTTP, для этого существует специальный сервис:

В ответе утилита сообщит где вы можете найти загруженный файл.

Отправка данных POST

Вы можете отправлять не только файлы, но и любые данные методом POST. Напомню, что этот метод используется для отправки данных различных форм. Для отправки такого запроса используйте опцию -d. Для тестирования будем пользоваться тем же сервисом:

Если вас не устраивает такой вариант отправки, вы можете сделать вид, что отправили форму. Для этого есть опция -F:

Здесь мы передаем формой поле password, с типом обычный текст, точно так же вы можете передать несколько параметров.

Передача и прием куки

Куки или Cookie используются сайтами для хранения некой информации на стороне пользователя. Это может быть необходимо, например, для аутентификации. Вы можете принимать и передавать Cookie с помощью curl. Чтобы сохранить полученные Cookie в файл используйте опцию -c:

Затем можно отправить cookie curl обратно:

Передача и анализ заголовков

Не всегда нам обязательно нужно содержимое страницы. Иногда могут быть интересны только заголовки. Чтобы вывести только их есть опция -I:

А опция -H позволяет отправить нужный заголовок или несколько на сервер, например, можно передать заголовок If-Modified-Since чтобы страница возвращалась только если она была изменена:

Аутентификация curl

Если на сервере требуется аутентификация одного из распространенных типов, например, HTTP Basic или FTP, то curl очень просто может справиться с такой задачей. Для указания данных аутентификации просто укажите их через двоеточие в опции -u:

Точно так же будет выполняться аутентификация на серверах HTTP.

Использование прокси

Если вам нужно использовать прокси сервер для загрузки файлов, то это тоже очень просто. Достаточно задать адрес прокси сервера в опции -x:

Команда 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, но здесь перечислено все основное, что вам придется использовать.

Как получить заголовки ответа

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

$ch = curl_init();

$headers = [];

curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// ... остальные опции

// this function is called by curl for each header received
curl_setopt($ch, CURLOPT_HEADERFUNCTION,  function($curl, $header) use (&$response_headers)  {
    $len = strlen($header);
    $header = explode(':', $header, 2);
    if (count($header) < 2) { // ignore invalid headers
      return $len;
    }

    $headers))][] = trim($header);

    return $len;
  }
);

$data = curl_exec($ch);

print_r($response_headers); // выводим заголовки ответа

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

Рассмотрим такой пример:

$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
// ...

$response = curl_exec($ch);

// Then, after your curl_exec call:
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$body = substr($response, $header_size);

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

POST запрос при помощи cURL

Теперь давайте отправим post запрос на адрес https://httpbin.org/anything

$url = 'https://httpbin.org/anything'; // url, на который отправляется запрос
$post_data = [ // поля нашего запроса
    'field1' => 'val_1',
    'field2' => 'val_2',
];

$headers = []; // заголовки запроса

$post_data = http_build_query($post_data);

$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, true); // true - означает, что отправляется POST запрос

$result = curl_exec($curl);

Отлично, с GET и POST запросами в cURL мы немного освоились.
Теперь разберемся с заголовками, которые мы можем отсылать в запросе.

Заголовки устанавливаются при помощи опции CURLOPT_HTTPHEADER
Чтобы получше узнать, для чего нужна эта опция давайте попробуем отправить POST запрос в формате JSON

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

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

$ curl http://curl.haxx.se

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

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

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

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

Метод GET

Когда мы вбиваем адрес скрипта и нажимаем Enter, выполняется GET-запрос по протоколу HTTP. В этом типе запроса к основному адресу мы можем прикрепить дополнительные параметры. Для того чтобы передать их, в конце основного адреса ставится знак вопроса, и мы можем перечислять эти параметры — вот так:
параметр1=значение1.
При этом если нам нужно указать несколько параметров, то мы разделяем их с помощью знака амперсанда:
арг1=знач1&арг2=знач2.

Пример:http://myproject.loc/index.php?arg1=123&arg2=scrrr

Если сейчас перейти по этой ссылке в браузере, то на сервер передадутся 2 параметра:

  • arg1 со значением 123;
  • arg2 со значением scrrr.

Мы можем очень просто получить к ним доступ из PHP с помощью магической переменной $_GET. Эта переменная является суперглобальной, то есть доступна нам в PHP всегда и в любом месте. Она представляет собой ассоциативный массив, в котором хранятся все переданные в запросе GET-параметры.

Давайте изменим код нашего index.php, чтобы узнать, что именно хранится в этой переменной.

И откроем этот url: http://myproject.loc/index.php?arg1=123&arg2=scrrr

Мы увидим следующее:

Как мы можем видеть, это действительно наши переданные аргументы, представленные в виде ассоциативного массива.

Живой пример отправки данных методом POST

Не будем повторять, что уже было сказано, лишь посмотрим на некоторые изменения, которые я внес в форму, чтобы она работала так, как мне нужно здесь.

Чтобы вы не ходили в поисках результата, нам потребуется вернуться к нашему результату в этом пункте, поэтому нам понадобится

<a name=»example»></a>
В форме в атрибуте — прописываем значение выше приведенного якоря «name»:<a name=»example»></a>

И для вывода переданных данных используем echo, использовали два типа кавычек ‘ и «

echo ‘<div class=»kod»><span style=»color: red;»>Вы ввели данные: </span><br>
$login = ‘. strip_tags ( $_POST ).’ <br>
$psw = ‘. strip_tags ( $_POST ).'</div>’;

Соберем всю форму и скрипт вместе:

Полный код выше идущей формы с php обработчиком пост запроса!

<a name=»example»></a>

<?

if($_POST)

{

  echo ‘<div class=»kod»><span style=»color: red;»>Вы ввели данные: </span><br>

  $login = ‘. strip_tags ( $_POST ).’ <br>

  $psw = ‘. strip_tags ( $_POST ).'</div>’;

}

?>

<form method=»post» =»»>

  <input type=»text» name=»login»><br>

  <input type=»password» name=»psw» ><br>

  <input type=»submit» name=»send» value=»ОТПРАВИТЬ» /><br>

</form>

Если нужен стиль использованного class-a «kod»

<style>

.kod {

display: block;

background: #fbfbfb;

margin: 20px 0 10px 0;

padding: 20px;

border: 1px solid #a7a7a7;

font-size: 14px;

word-break: break-word;

}

</style>

И данный код разместим прямо здесь!

Введите какие-то данные в поля ввода и нажмите отправить:

Работа по протоколу FTP

Скачать файл с FTP-сервера:

> curl -u username:password -O ftp://example.com/file.zip

Если заданный FTP путь является директорией, то по умолчанию будет выведен список файлов в ней:

> curl -u username:password -O ftp://example.com/public_html/

Выгрузить файл на FTP-сервер

> curl -u username:password -T file.zip ftp://example.com/

Получить вывод из стандартного ввода и сохранить содержимое на сервере под именем :

> curl -u username:password -T - ftp://example.com/data.txt

Дополнительно:

  • Утилита curl. Обмен данными с сервером
  • Пользуемся curl для отладки HTTP

Поиск:
CLI • CURL • Cookie • FTP • GET • HTTP • Linux • POST • URL • Web-разработка • Windows • Форма

Второй вариант отправки данных, с помощью multipart/form-data для отправки файлов.

В данном примере передаются переменные mass и var, а так же текстовый файл a.txt, имеющий имя в форме var_file
В первую очередь обратите внимание на заголовок Content-type: multipart/form-data, boundary=ccf8111910. Именно multipart/form-data дает право пересылать не только текстовые значения переменных, но и файлы

Так же в этой строке указывается разделитель данных boundary=… Это любой набор цифр или символов и будет служить для отделения значений друг от друга. Значение boundary должно быть уникальным в пределах пересылаемой информации, то есть таких символов не должно встречаться в пересылаемых файлах или переменных.
Все остальные заголовки точно такие же, как при отправке первым методом описаным в начале статьи.
После заголовков пошли данные. Все данные отделяются друг от друга разделителем boundary, который придумали и объявили в заголовках.
Начинать разделитель нужно с «—«.
Так пересылается одна переменная с именем mass, в даном случае даже массив.
Далее можно перечислять таким же способом переменные и файлы, отделяя их друг от друга разделителями.
Для отправки файла нужно добавить еще тип и имя файла

В конце перечисления файлов и переменных нужно закрыть разделитель, добавив в конце разделителя «» —ccf8111910—
В случае с текстовыми файлами содержимое файла можно прописывать прямо сразу текстом, как в моем примере. Не обязательно для этого создавать реальный файл, а затем его считывать.

Сейчас покажу как этот пример реализовать на php

Внимание!!!mime_content_type

Метод 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 не сделает этого за вас

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

Получение и отправка заголовков

По умолчанию, заголовки ответа сервера не показываются. Но это можно исправить:

> curl -i google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=utf-8
Date: Sun, 16 Sep 2018 08:28:18 GMT
Expires: Tue, 16 Oct 2018 08:28:18 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN

<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

Если содержимое страницы не нужно, а интересны только заголовки (будет отправлен запрос):

> curl -I http://www.example.com/
HTTP/1.1 200 OK
Date: Sun, 16 Sep 2018 08:20:52 GMT
Server: Apache/2.4.34 (Win64) mod_fcgid/2.3.9
X-Powered-By: PHP/7.1.10
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Set-Cookie: PHPSESSID=svn7eb593i8d2gv471rs94og58; path=/
Set-Cookie: visitor=fa867bd917ad0d715830a6a88c816033; expires=Mon, 16-Sep-2019 08:20:53 GMT; Max-Age=31536000; path=/
Set-Cookie: lastvisit=1537086053; path=/
Content-Length: 132217
Content-Type: text/html; charset=utf-8

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

> curl -v google.com
  • Строка, начинающаяся с означает заголовок, отправленный серверу
  • Строка, начинающаяся с означает заголовок, полученный от сервера
  • Строка, начинающаяся с означает дополнительные данные от CURL
* Rebuilt URL to: http://google.com/
*   Trying 173.194.32.206...
* TCP_NODELAY set
* Connected to google.com (173.194.32.206) port 80 (#0)
> GET / HTTP/1.1
> Host: google.com
> User-Agent: curl/7.61.1
> Accept: */*
>
< HTTP/1.1 301 Moved Permanently
< Location: http://www.google.com/
< Content-Type: text/html; charset=utf-8
< Date: Mon, 17 Sep 2018 15:11:49 GMT
< Expires: Wed, 17 Oct 2018 15:11:49 GMT
< Cache-Control: public, max-age=2592000
< Server: gws
< Content-Length: 219
< X-XSS-Protection: 1; mode=block
< X-Frame-Options: SAMEORIGIN
<
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
* Connection #0 to host google.com left intact

Если этой информации недостаточно, можно использовать опции или .

А вот так можно отправить свой заголовок:

> curl -H "User-Agent: Mozilla/5.0" http://www.example.com/

Пару слов о других полезных опциях cURL

HTTP Аутентификация

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

$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 загрузка

В PHP также существует библиотека для работы с FTP, но вам ничего не мешает и тут воспользоваться средствами cURL:

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

// в url должно быть следующее содержание
$url = "ftp://username:[email protected]: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);

Используем Прокси

Вы можете выполнить свой URL запрос через прокси:

$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);

Функции обратного вызова

Также существует возможность указать функцию, которая будет срабатывать ещё до завершения работы cURL запроса. Например, пока содержание ответа загружается, вы можете начать использовать данные, не дожидаясь полной загрузки.

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL,'http://net.tutsplus.com');

curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");

curl_exec($ch);

curl_close ($ch);

function progress_function($ch,$str) {

    echo $str;
    return strlen($str);

}

Подобная функция ДОЛЖНА возвращать длину строки, что является обязательным требованием.

Инкапсуляция операций в классе Curl

При использовании Curl в проекте рекомендуется инкапсулировать весь код вместо использования функций, описанных выше. Иначе придется повторно запускать больше кода. Кроме этого повышается вероятность возникновения ошибок. Мы собираемся создать класс, который инкапсулирует эту логику.

curl_class.php

<?php
/**
 * Методы обработки Curl-запроса.
 */
class CURL {
    /**
     * Объект Curl-запроса.
     */
    private $request;
    /**
     * Конструктор класса CURL.
     *
     * @throws Exception, если при инициализации возникли ошибки.
     */
    public function __construct() {
        $this->request = curl_init();
        $this->throwExceptionIfError($this->request);
    }
    /**
     * Настройка Curl -запроса.
     *
     * @param $url Целевой url-адрес.
     * @param $urlParameters Массив параметров в формате 'key' => 'value'.
     * @param $method 'GET' или 'POST'; по умолчанию - 'GET'.
     * @param $moreOptions Другие параметры, добавляемые к Curl -запросу. 
     * По умолчанию задано 'CURLOPT_FOLLOWLOCATION'(переходить по редиректам 3XX) и 'CURLOPT_RETURNTRANSFER'
     * (возвращает ответ HTTP в качестве значения, вместо вывода напрямую).
     * @throws Exception, если возникли ошибки при настройке.
     */
    public function configure($url, $urlParameters = [], $method = 'GET',
        $moreOptions = ) {
        curl_reset($this->request);
        switch ($method) {
            case 'GET':
                $options = ;
                break;
            case 'POST':
                $options = ;
                break;
            default:
                throw new Exception('Method must be "GET" or "POST".');
                break;
        }
        $options = $options + $moreOptions; 
        foreach ($options as $option => $value) {
            $configured = curl_setopt($this->request, $option, $value);
            $this->throwExceptionIfError($configured);
        }
    }
    /**
     * Выполняем Curl-запрос в соответствии с параметрами конфигурации.
     *
     * @return возвращает значение функции curl_exec(). Если настроен CURLOPT_RETURNTRANSFER,
     *     возвращаемое значение будет ответом HTTP. В противном случае, значение true (или false,
     *     если возникла ошибка).
     * @throws Exception, если возникла ошибка при исполнении.
     */
    public function execute() {
        $result = curl_exec($this->request);
        $this->throwExceptionIfError($result);
        return $result;
    }
    /**
     * Закрываем сессию Curl.
     */
    public function close() {
        curl_close($this->request);
    }
    /**
     * Проверяем, вернули ли функции curl_* штатное значение или ошибку, добавляя исключение
     * с сообщением об ошибке Curl в случае возникновения ошибки.
     *
     * @param $success была ли функция curl выполнена успешно или нет.
     * @throws Exception, если функция curl не выполнена.
     */
    protected function throwExceptionIfError($success) {
        if (!$success) {
            throw new Exception(curl_error($this->request));
        }
    }
    /**
     * Составляем строку параметров GET.
     *
     * @param $parameters массив параметров.
     * @return Parameters в формате строки: '?key1=value1&key2=value2'
     */
    protected function stringifyParameters($parameters) {
        $parameterString = '?';
        foreach ($parameters as $key => $value) {
            $key = urlencode($key);
            $value = urlencode($value);
            $parameterString .= "$key=$value&";
        }
        rtrim($parameterString, '&');
        return $parameterString;
    }
}

В этом коде класса PHP Curl post запроса нет ничего, чего мы не рассматривали выше. За исключением способа, с помощью которого задаются параметры через функцию curl_setopt().

Чтобы использовать этот класс, нужно сделать что-то вроде этого:

<?php
require_once('curl_class.php');
try {
    $curl = new CURL();
    $curl->configure('webcodegeeks.com');
    $response = $curl->execute();
    $curl->close();
} catch (Exception $exception) {
    die('An exception has been thrown: ' . $exception->getMessage());
}

Приведенный выше код является более читаемым и простым в обслуживании. А также более гибким, так как он позволяет настроить любой параметр Curl.

Примечание: Запросы Curl могут быть использованы повторно, что позволяет увеличить производительность.

Например:

<?php
require_once('curl_class.php');
try {
    $curl = new CURL();
    $curl->configure('webcodegeeks.com');
    $response1 = $curl->execute();
    $curl->configure('webcodegeeks.com', , 'GET');
    $response2 = $curl->execute();
    $curl->close();
} catch (Exception $exception) {
    die('An exception has been thrown: ' . $exception->getMessage());
}

Данный скрипт обработки post запроса PHP будет работать без проблем. Это лучше, чем закрывать и открывать новую сессию Curl для каждого запроса. В нашем случае прирост производительности будет несущественным, но при нескольких запросах разница будет ощутимой.

Для повторного использования сессий Curl необходимо очистить и удалить установленные параметры, прежде чем добавлять новые. Это было сделано в файле curl_class.php с помощью функции curl_reset().

Заключение

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

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

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

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

Пожалуйста, оставляйте свои отзывы по текущей теме статьи. За комментарии, дизлайки, отклики, лайки, подписки низкий вам поклон!

Вадим Дворниковавтор-переводчик статьи «PHP Curl Get-Post Example»

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: