Php curl post пример

Технология 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 может отправить форму на странице, получить ответ, обработать ошибку, начать всё заново и т.д.

Принцип работы cURL

При использовании cURL-запросов существует 4 основных шага, которые должны (обязаны) быть в вашем скрипте, это:

  • Инициализация
  • Назначение параметров
  • Выполнение и выборка результата
  • Освобождение памяти

Без любого из этих шагов ваш скрипт обречен на неудачу. Итак, основные шаги:

Думаю что все шаги вам понятны за исключением второго: "Указания параметров". На этом шаге мы остановимся более подробно, т.к. именно он задает все необходимые настройки / параметры / методы.

Ошибки в ходе работы скрипта

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

Отмечу, что знак сравнения здесь ‘===’, а не ‘==’, т.е. сравнивается именно на наличие логического FALSE, а не пустой строки или строки ‘false’.

Результат запроса

Ну а после того, как CURL-запрос был выполнен, неплохо бы было знать, что он вернул:

А вот какие еще даные мы можем получить:

Индекс массива Значение Индекс массива Значение
url string(17) "https://intop24.ru" content_type string(24) "text/html; charset=utf-8"
http_code int(200) header_size int(218)
request_size int(49) filetime int(-1)
ssl_verify_result int(0) redirect_count int(0)
total_time float(0.009419) namelookup_time float(1.3E-5)
connect_time float(1.3E-5) pretransfer_time float(1.4E-5)
size_upload float(0) size_download float(46523)
speed_download float(4939271) speed_upload float(0)
download_content_length float(-1) upload_content_length float(0)
starttransfer_time float(0.009374) redirect_time float(0)
certinfo array(0) redirect_url string(0) ""

POST запрос с помощью CURL

Давайте напишем наш первый скрипт, который отправит данные методом POST на какую-нибудь страницу и посмотрит, что отобразилось на этой странице.

Сначала нам нужен файл, который бы принял наши данные и что-то вывел на страницу. Я расположил его по адресу https://intop24.ru/demo/curl/post.php. В нем содержится следующий код:

Теперь попробуем передать туда какие-то данные:

Результат можно посмотреть здесь: curl_post.php

Отправка файла с помощью CURL

Смысл здесь абсолютно такой же, как и в запросе POST.

Файл, который примет данные: https://intop24.ru/demo/curl/upload_file.php.

Теперь попробуем передать туда какие-то данные:

Результат можно посмотреть здесь: curl_post_file.php

Загрузка файла — это тот же самый POST-запрос, однако перед путем к файлу стоит знак "@", что и обозначает, что нужно это передать не как $_POST, а как $_FILES.

Читайте также:  Минимальные требования для war thunder

HTTP аутентификация с помощью CURL

Довольно полезная штука.

Запрос сURL через прокси

Понравилась или помогла статья? Самое лучшее, что ты можешь сделать — это поделиться ею в любой из своих соцсетей (даже если ты поделишься в твиттере или google+, которыми ты не пользуешься — это очень поможет развитию моего блога). Спасибо! А если ты еще и оставишь любой комментарий снизу в обсуждениях, то это будет двойное СПАСИБО!

GET запрос

POST запрос

file_get_contents() так же умеет отправлять POST запросы:

PUT запрос

DELETE запрос

HTTP-метод DELETE используется в REST API для удаления объектов.

Отправка файлов на другой сервер

Отправка файлов осуществляется методом POST :

С PHP 5.5 такой метод загрузки файлов вызывает ошибку, поэтому следует применять CURLFile.

Также через curl можно отправить сразу несколько файлов:

Еще файлы можно отправить методом PUT , например так загружаются файлы в REST API Яндекс Диска.

Скачивание файлов

Curl позволяет сохранить результат сразу в файл, указав указатель на открытый файл в параметре CURLOPT_FILE .

Отправить и получить cookie

Чтобы CURL сохранял куки в файле достаточно прописать его путь в параметрах CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR .

Передать значение кук можно принудительно через параметр CURLOPT_COOKIE .

Имитация браузера

На многих сайтах есть защита от парсинга. Она основана на том что браузер передает серверу user agent , referer , cookie . Сервер проверяет эти данные и возвращает нормальную страницу. При подключение через curl эти данные не передаются и сервер отдает ошибку 404 или 500. Чтобы имитировать браузер нужно добавить заголовки:

HTTP авторизация

Если на сервере настроена HTTP авторизация, например с помощью .htpasswd, подключится к нему можно с помощью параметра CURLOPT_USERPWD .

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

Прежде чем отправлять POST-запросы, необходимо определиться, как это будет происходить и что нам для этого нужно. Нам нужно два файла: источник и приёмник. Соответственно, в источнике мы будем отправлять POST-запрос через cURL на приёмник. Приёмник будет этот запрос обрабатывать, а источник с помощью cURL примет результат этой обработки. Надеюсь, что здесь всё понятно. Теперь о том, что будет отправляться и что будет происходить. Отправляться источником будут два числа. А приёмник будет считать сумму двух чисел, пришедших через POST-запрос. В результате, сумма двух чисел вернётся от приёмника к источнику, а далее мы это число просто распечатаем.

Итак, давайте начнём с кода для файла-приёмника ("receiver.php"):

Здесь всё очень просто: записываем в переменные $a и $b данные из POST-запроса, а дальше выводим их сумму.

Теперь создадим файл-источник:

Опция CURLOPT_POST имеет значение true, что означает, что данные передаются методом POST. А в опции CURLOPT_POSTFIELDS содержится уже строка с передаваемыми данными. Если Вы запустите этот скрипт, то увидите число "11", что и предполагалось (4+7).

Читайте также:  Устройство содержит три независимо работающих элемента

Если вдруг Вы не понимаете, что происходит в других строчках кода, то почитайте статью работа с cURL, где подробно описываются все другие операции.

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

P.S. Всех дам поздравляю с 8-м марта! Желаю всегда оставаться красивыми, жизнерадостными и иметь рядом с собой достойного мужчину!

Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!

Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.

Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления

Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.

Порекомендуйте эту статью друзьям:

Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):

Она выглядит вот так:

  • BB-код ссылки для форумов (например, можете поставить её в подписи):
  • Комментарии ( 23 ):

    Спасибо за статью, полезно. Только вопрос: что делать если на странице есть ссылки типа scr=/folder/img.jpg?

    Написать скрипт, которые заменяет относительные пути абсолютными.

    Спасибо, в принципе так и думал, но хотел узнать нет ли встроенного решения у curl.

    А как проверить это в Денвере? задала URL Z:/home/test1.ru/www/res.php — не работает.

    Такая ссылка неправильная. Надо писать test1.ru/res.php

    Не подскажите что делаю не так? Хотел написать простенький скрипт для авторизации на одном сайте, вот он if( $curl = curl_init() ) < curl_setopt($curl,CURLOPT_URL,’http:/primer.php’); curl_setopt($curl,CURLOPT_RETURNTRANSFER,true); curl_setopt($curl,CURLOPT_NOBODY,false); curl_setopt($curl,CURLOPT_HEADER,true); curl_setopt($curl, CURLOPT_POST, true); curl_setopt($curl, CURLOPT_POSTFIELDS, "login=4dd&passwd=df&submit=Вход&remember_me=&check_ip="); $out = curl_exec($curl); echo $out; curl_close($curl); >логин и пароль заведомо неверные, также передел значение кнопки submit+ название двух чекббоксов, которые я оставли неотмеченными поэтому и ничеко не присвоил им. Проблема в том, что на странице не выводится сообщение о неверном пароле, она выглядит так как будто я ничего и не писал. В чем может быть загвоздка?

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

    Спасибо, попробую насчет сессий. Но я вот что не понял: разве в заголовке не должны хранится все параметры то есть данные Post, cookie, session? а то мне выводят вот что. HTTP/1.1 200 OK Server: nginx/1.1.8 Date: Sun, 25 Nov 2012 07:01:39 GMT Content-Type: text/html; charset=windows-1251 Transfer-Encoding: chunked Connection: keep-alive Cache-Control: no-cache, no-store, must-reval >

    Читайте также:  Как много файлов pdf собрать в один

    Сессии не хранятся в заголовках, они в файлах лежат на сервере. А в cookie только идентификатор, возможно, user_id это он и есть.

    Отличная статья коротко и понятно! Подскажите,как можно сделать,чтобы передаваемые данные из файла ‘источник’ в файл ‘приемник’ обработанные данные не возвращались обратно в файл ‘источник’.

    curl_setopt($curl, CURLOPT_RETURNTRANSFER,true) — поставить тут false, тогда ничего возвращаться уже не будет.

    Из статьи понял, что в папке сервера лежат 2 файла: файл-источник и файл-приёмник. Файл-приёмник имеет название "receiver.php", а файл- источник — . Назвал его «Index.php». Он же и запускается или что-то не так? Спасибо.

    Назвать источник можно как угодно.

    Приятно писать комментарии, задавать вопросы и знать,что на них всегда ответят! Спасибо,Михаил!

    Не так вопрос сформулировала. Михаил, очень нужна ваша помощь! Есть файл "index.php", "index_1.php" и "index_2.php". Из файла "index.php" при клике по ссылке подгружается файл "index_1.php" с помощью "fancybox". В "index_1.php" обрабатываются полученные данные,отправляем данные с помощью формы в файл "index_2.php". В файле"index_2.php" обрабатываем данные в зависимости от данных получаем значение и помещаем в переменную $var. Как можно передать значение переменной $var обратно в файл "index.php",чтобы можно было продолжать работать с этой переменной без перезагрузки страницы. Если с помощью сессии ,то после закрытия окна "fancybox",чтобы продолжать работу с $var в файле "index.php" приходится перезагружать страницу. Если с помощью формы,то окно "fancybox" не закрывается. Можно с помощью CURL решить вопрос? Ооочень надеюсь на вашу помощь!

    Да, с помощью cURL можно отправить GET или POST запрос с нужной переменной.

    Вопрос в том,как это сделать? $url = "http://localhost/autocomplete/index.php"; $post_data = array ( "da" =>$var , ); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); curl_setopt($curl, CURLOPT_RETURNTRANSFER,true); curl_setopt($ch, CURLOPT_NOBODY,0); curl_exec($ch); curl_close($ch); Так? Но в этом случаи подгружается файл "index.php"

    Надо в curl_init указать путь к файлу.

    curl_setopt($ch, CURLOPT_URL, $url) А ,что этого не достаточно? curl_init("http://localhost/autocomplete/index.php"); Никаких изменений не произошло

    Чтобы подгружался другой файл, надо написать в $url другой файл, а не index.php Вы подгружаете этот файл, а потом пишите, что хотели другой файл, а не index.php

    Все равно возвращаются, только к числу 11 добавляется через пробел число 1, а в файле приемнике в любом случае выводится 0.

    irin, У меня тоже был ноль, заработало после того, как изменил адрес файла-приёмника в файле-источнике: с ‘receiver.php’ на ‘http://domain/receiver.php’ У меня файл лежит в: Z:homedomainwww
    eceiver.php То есть нужно указать: ‘http://"имя вашей папки"/"имя вашего файла-приёмника"’.

    Для добавления комментариев надо войти в систему.
    Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.

    Copyright © 2010-2020 Русаков Михаил Юрьевич. Все права защищены.

    Ссылка на основную публикацию
    Adblock
    detector