Поиск…


Синтаксис

  • resource curl_init ([string $ url = NULL])
  • bool curl_setopt (ресурс $ ch, int $ option, смешанное значение $)
  • bool curl_setopt_array (ресурс $ ch, array $ options)
  • смешанный curl_exec (ресурс $ ch)
  • void curl_close (ресурс $ ch)

параметры

параметр подробности
curl_init - Инициализировать сеанс cURL
URL URL-адрес, который будет использоваться в запросе cURL
curl_setopt - Установите опцию для передачи cURL
ч Ручка cURL (возвращаемое значение из curl_init () )
вариант CURLOPT_XXX для установки - см. Документацию по PHP для списка параметров и допустимых значений
значение Значение, заданное для дескриптора cURL для данной опции
curl_exec - выполнить сеанс cURL
ч Ручка cURL (возвращаемое значение из curl_init () )
curl_close - Завершить сеанс cURL
ч Ручка cURL (возвращаемое значение из curl_init () )

Основное использование (запросы GET)

cURL - это инструмент для передачи данных с синтаксисом URL. Он поддерживает HTTP, FTP, SCP и многие другие (curl> = 7.19.4). Помните, что вам необходимо установить и включить расширение cURL .

// a little script check is the cURL extension loaded or not
if(!extension_loaded("curl")) {
    die("cURL extension not loaded! Quit Now.");
}

// Actual script start

// create a new cURL resource
// $curl is the handle of the resource
$curl = curl_init();

// set the URL and other options
curl_setopt($curl, CURLOPT_URL, "http://www.example.com");

// execute and pass the result to browser
curl_exec($curl);

// close the cURL resource
curl_close($curl);

Запросы POST

Если вы хотите подражать 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) {
    $chs[$key] = curl_init($url);
    curl_setopt($chs[$key], CURLOPT_RETURNTRANSFER, true);
    curl_setopt($chs[$key], CURLOPT_POST, true);
    curl_setopt($chs[$key], CURLOPT_POSTFIELDS, $request_contents[$key]);

    curl_multi_add_handle($mh, $chs[$key]);
}

Затем мы используем 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);

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 на страницу входа.

<?php

# create a cURL handle
$ch  = curl_init();

# set the URL (this could also be passed to curl_init() if desired)
curl_setopt($ch, CURLOPT_URL, "https://www.example.com/login.php");

# set the HTTP method to POST
curl_setopt($ch, CURLOPT_POST, true);

# setting this option to an empty string enables cookie handling
# but does not load cookies from a file
curl_setopt($ch, CURLOPT_COOKIEFILE, "");

# set the values to be sent
curl_setopt($ch, CURLOPT_POSTFIELDS, array(
    "username"=>"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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow