- PHP Использование cURL в PHP
- Использование multi_curl для создания нескольких запросов POST
- Создание и отправка запроса с помощью специального метода
- Использование файлов cookie
- Отправка многомерных данных и нескольких файлов с помощью CurlFile по одному запросу
- Получить и установить пользовательские заголовки HTTP в php
PHP
Использование cURL в PHP
Если вы хотите подражать HTML-форме POST-действия, вы можете использовать cURL.
// POST data in array $post = [ 'a' => 'apple', 'b' => 'banana' ]; // Create a new cURL resource with URL to POST $ch = curl_init('http://www.example.com'); // We set parameter CURLOPT_RETURNTRANSFER to read output curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // Let's pass POST data curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // We execute our request, and get output in a $response variable $response = curl_exec($ch); // Close the connection curl_close($ch);
Использование multi_curl для создания нескольких запросов POST
Иногда нам нужно сделать много запросов POST для одной или нескольких разных конечных точек. Чтобы справиться с этим сценарием, мы можем использовать multi_curl .
Прежде всего, мы создаем, сколько запросов нужно точно так же, как и простой пример, и помещаем их в массив.
Мы используем curl_multi_init и добавляем к нему каждый дескриптор.
В этом примере мы используем две разные конечные точки:
//array of data to POST $request_contents = array(); //array of URLs $urls = array(); //array of cURL handles $chs = array(); //first POST content $request_contents[] = [ 'a' => 'apple', 'b' => 'banana' ]; //second POST content $request_contents[] = [ 'a' => 'fish', 'b' => 'shrimp' ]; //set the urls $urls[] = 'http://www.example.com'; $urls[] = 'http://www.example2.com'; //create the array of cURL handles and add to a multi_curl $mh = curl_multi_init(); foreach ($urls as $key => $url)
Затем мы используем curl_multi_exec для отправки запросов
//running the requests $running = null; do < curl_multi_exec($mh, $running); >while ($running); //getting the responses foreach(array_keys($chs) as $key) < $error = curl_error($chs[$key]); $last_effective_URL = curl_getinfo($chs[$key], CURLINFO_EFFECTIVE_URL); $time = curl_getinfo($chs[$key], CURLINFO_TOTAL_TIME); $response = curl_multi_getcontent($chs[$key]); // get results if (!empty($error)) < echo "The request $key return a error: $error" . "\n"; >else < echo "The request to '$last_effective_URL' returned '$response' in $time seconds." . "\n"; >curl_multi_remove_handle($mh, $chs[$key]); > // close current handler curl_multi_close($mh);
Возможным возвратом для этого примера может быть:
Запрос на « http://www.example.com » возвратил «фрукты» через 2 секунды.
Запрос на « http://www.example2.com » вернул «морепродукты» через 5 секунд.
Создание и отправка запроса с помощью специального метода
По умолчанию PHP Curl поддерживает запросы GET и POST . Также можно отправлять пользовательские запросы, такие как DELETE , PUT или PATCH (или даже нестандартные методы), используя параметр CURLOPT_CUSTOMREQUEST .
$method = 'DELETE'; // Create a DELETE request $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method); $content = curl_exec($ch); curl_close($ch);
Использование файлов cookie
cURL может сохранять файлы cookie, полученные в ответах, для использования с последующими запросами. Для простой обработки cookie сеанса в памяти это достигается с помощью одной строки кода:
curl_setopt($ch, CURLOPT_COOKIEFILE, "");
В случаях, когда вы должны сохранять файлы cookie после уничтожения дескриптора cURL, вы можете указать файл для их хранения в:
curl_setopt($ch, CURLOPT_COOKIEJAR, "/tmp/cookies.txt");
Затем, когда вы хотите использовать их снова, передайте их как файл cookie:
curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp/cookies.txt");
Помните, однако, что эти два шага не нужны, если вам не нужно переносить куки между различными ручками cURL. В большинстве случаев использование CURLOPT_COOKIEFILE для пустой строки — это все, что вам нужно.
Обработка файлов cookie может использоваться, например, для извлечения ресурсов с веб-сайта, для которого требуется логин. Обычно это двухэтапная процедура. Сначала POST на страницу входа.
"joe_bloggs", "password"=>"$up3r_$3cr3t", )); # return the response body curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); # send the request $result = curl_exec($ch);
Второй шаг (после выполнения стандартной проверки ошибок) обычно является простым запросом GET. Важно повторить использование существующего дескриптора cURL для второго запроса. Это гарантирует, что файлы cookie с первого ответа будут автоматически включены во второй запрос.
# we are not calling curl_init() # simply change the URL curl_setopt($ch, CURLOPT_URL, "https://www.example.com/show_me_the_foo.php"); # change the method back to GET curl_setopt($ch, CURLOPT_HTTPGET, true); # send the request $result = curl_exec($ch); # finished with cURL curl_close($ch); # do stuff with $result.
Это предназначено только для примера обработки файлов cookie. В реальной жизни вещи обычно сложнее. Часто вы должны выполнить начальное GET страницы входа, чтобы вытащить токен входа, который должен быть включен в ваш POST. Другие сайты могут блокировать клиент cURL на основе его строки User-Agent, требуя, чтобы вы его изменили.
Отправка многомерных данных и нескольких файлов с помощью CurlFile по одному запросу
Допустим, у нас есть форма, подобная приведенной ниже. Мы хотим отправить данные на наш веб-сервер через AJAX, а оттуда — на скрипт, запущенный на внешнем сервере.
Таким образом, у нас есть нормальные входы, поле для множественного выбора и область падения файлов, где мы можем загружать несколько файлов.
Предполагая, что запрос AJAX POST был успешным, мы получаем следующие данные на сайте PHP:
// print_r($_POST) Array ( [first_name] => John [last_name] => Doe [activities] => Array ( [0] => soccer [1] => hiking ) )
и файлы должны выглядеть так:
// print_r($_FILES) Array ( [upload] => Array ( [name] => Array ( [0] => my_photo.jpg [1] => my_life.pdf ) [type] => Array ( [0] => image/jpg [1] => application/pdf ) [tmp_name] => Array ( [0] => /tmp/phpW5spji [1] => /tmp/phpWgnUeY ) [error] => Array ( [0] => 0 [1] => 0 ) [size] => Array ( [0] => 647548 [1] => 643223 ) ) )
Все идет нормально. Теперь мы хотим отправить эти данные и файлы на внешний сервер, используя cURL с классом CurlFile
Поскольку cURL принимает только простой, но не многомерный массив, мы сначала должны сгладить массив $ _POST.
Для этого вы можете использовать эту функцию, например, которая дает вам следующее:
// print_r($new_post_array) Array ( [first_name] => John [last_name] => Doe [activities[0]] => soccer [activities[1]] => hiking )
Следующим шагом будет создание объектов CurlFile для загруженных файлов. Это делается в следующем цикле:
$files = array(); foreach ($_FILES["upload"]["error"] as $key => $error) < if ($error == UPLOAD_ERR_OK) < $files["upload[$key]"] = curl_file_create( $_FILES['upload']['tmp_name'][$key], $_FILES['upload']['type'][$key], $_FILES['upload']['name'][$key] ); >>
curl_file_create является вспомогательной функцией класса CurlFile и создает объекты CurlFile. Мы сохраняем каждый объект в массиве $ files с ключами «upload [0]» и «upload [1]» для двух наших файлов.
Теперь нам нужно объединить сплющенный массив сообщений и массив файлов и сохранить его как $ data следующим образом:
$data = $new_post_array + $files;
Последний шаг — отправить запрос cURL:
$ch = curl_init(); curl_setopt_array($ch, array( CURLOPT_POST => 1, CURLOPT_URL => "https://api.externalserver.com/upload.php", CURLOPT_RETURNTRANSFER => 1, CURLINFO_HEADER_OUT => 1, CURLOPT_POSTFIELDS => $data )); $result = curl_exec($ch); curl_close ($ch);
Поскольку $ data теперь является простым (плоским) массивом, cURL автоматически отправляет этот запрос POST с типом контента: multipart / form-data
В upload.php на внешнем сервере теперь вы можете получить почтовые данные и файлы с $ _POST и $ _FILES, как обычно.
Получить и установить пользовательские заголовки HTTP в php
Отправка заголовка запроса
$uri = 'http://localhost/http.php'; $ch = curl_init($uri); curl_setopt_array($ch, array( CURLOPT_HTTPHEADER => array('X-User: admin', 'X-Authorization: 123456'), CURLOPT_RETURNTRANSFER =>true, CURLOPT_VERBOSE => 1 )); $out = curl_exec($ch); curl_close($ch); // echo response output echo $out;
Чтение настраиваемого заголовка
print_r(apache_request_headers());
Array ( [Host] => localhost [Accept] => */* [X-User] => admin [X-Authorization] => 123456 [Content-Length] => 9 [Content-Type] => application/x-www-form-urlencoded )
Мы также можем отправить заголовок, используя синтаксис ниже:
curl --header "X-MyHeader: 123" www.google.com
- Начало работы с PHP
- APCu
- BC Math (бинарный калькулятор)
- Imagick
- IMAP
- JSON
- Loops
- PDO
- PHP MySQLi
- php mysqli affected rows возвращает 0, когда он должен возвращать положительное целое число
- PHP Встроенный сервер
- PHPDoc
- PSR
- SimpleXML
- SQLite3
- Streams
- URL-адрес
- UTF-8,
- WebSockets
- XML
- YAML в PHP
- Автозагрузка грунтовки
- Альтернативный синтаксис для структур управления
- Анализ HTML
- Асинхронное программирование
- Аутентификация HTTP
- Безопасность
- Буферизация вывода
- Вклад в PHP Core
- Внедрение зависимости
- Внесение изменений в Руководство по PHP
- Волшебные константы
- Волшебные методы
- Вывод значения переменной
- Выполнение по массиву
- Генераторы
- закрытие
- Защитите Remeber Me
- Интерфейс командной строки (CLI)
- Использование cURL в PHP
- Использование MongoDB
- Использование Redis с PHP
- Использование SQLSRV
- Итерация массива
- Как определить IP-адрес клиента
- Как разбить URL-адрес
- Класс Datetime
- Классы и объекты
- Клиент SOAP
- Комментарии
- Компилировать расширения PHP
- Компиляция ошибок и предупреждений
- Константы
- Контрольные структуры
- криптография
- кэш
- локализация
- Манипулирование массивом
- Манипуляции заголовков
- Массивы
- Машинное обучение
- Менеджер зависимостей композитора
- Многопоточное расширение
- многопроцессорная обработка
- Монго-PHP
- Область переменных
- Обработка изображений с помощью GD
- Обработка исключений и отчетов об ошибках
- Обработка нескольких массивов вместе
- Обработка файлов
- Общие ошибки
- операторы
- отладка
- Отправка электронной почты
- отражение
- переменные
- Переменные Superglobal PHP
- Печенье
- Поддержка Unicode в PHP
- Пространства имен
- Работа с датами и временем
- Развертывание докеров
- Регулярные выражения (regexp / PCRE)
- Рекомендации
- Рецепты
- Розетки
- Сервер SOAP
- Сериализация
- Сериализация объектов
- сессии
- Соглашения о кодировании
- Создание PDF-файлов в PHP
- Спектакль
- Строковый анализ
- Структуры данных SPL
- Тестирование устройства
- Тип жонглирования и нерегулярные проблемы сравнения
- Тип подсказки
- Типы
- Установка в средах Linux / Unix
- Установка среды PHP в Windows
- Фильтры и функции фильтра
- Форматирование строк
- функции
- Функции хеширования пароля
- Функциональное программирование
- Черты
- Чтение данных запроса
- Шаблоны проектирования