Отправка HTTP запросов в PHP: практические примеры

Раздел: Сетевые запросы -> HTTP клиент

Обзор способов отправки HTTP запросов в PHP

Как отправить HTTP запрос с помощью cURL?

Библиотека cURL является наиболее гибким и распространённым инструментом для работы с HTTP в PHP. Она поддерживает все методы (GET, POST, PUT, DELETE и др.), работу с заголовками, cookie, сертификатами, прокси и таймаутами. Решение подходит для любых сценариев - от простых запросов к API до сложных многопоточных операций.

Пример базового GET запроса:


<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Ошибка cURL: ' . curl_error($ch);
}
curl_close($ch);
echo $response;
?>
  

Php отправка запроса (отправка http запроса на php)

Пояснение: curl_init создаёт сессию, CURLOPT_RETURNTRANSFER возвращает результат в переменную вместо вывода в поток. После выполнения проверяется код ошибки, затем сессия закрывается.

Типичные проблемы:

  • Ошибка SSL-сертификата - решается установкой CURLOPT_SSL_VERIFYPEER в false (не рекомендуется для продакшена) или указанием пути к CA bundle через CURLOPT_CAINFO.
  • Пустой ответ - часто из-за недоступности хоста или блокировки firewall.
  • Медленные запросы - настройка таймаутов через CURLOPT_TIMEOUT и CURLOPT_CONNECTTIMEOUT.

Как отправить запрос без cURL, используя file_get_contents?

Функция file_get_contents с контекстом потока позволяет выполнять HTTP запросы без внешних расширений. Подходит для простых GET и POST запросов, когда нет необходимости в тонкой настройке.


<?php
$options = [
    'http' => [
        'method' => 'GET',
        'header' => "User-Agent: MyApp\r\n"
    ]
];
$context = stream_context_create($options);
$result = file_get_contents('https://api.example.com/data', false, $context);
if ($result === false) {
    echo 'Ошибка при загрузке';
}
echo $result;
?>
  

Для POST запроса меняется метод и добавляется поле content:


<?php
$data = http_build_query(['key' => 'value']);
$options = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: application/x-www-form-urlencoded\r\n",
        'content' => $data
    ]
];
$context = stream_context_create($options);
$result = file_get_contents('https://api.example.com/submit', false, $context);
?>
  

Типичные ошибки:

  • Запрет удалённых открытий в php.ini - директива allow_url_fopen должна быть включена.
  • Отсутствие обработки HTTP-кодов ответа - функция не выбрасывает исключения при 404 или 500, нужно проверять через $http_response_header или использовать библиотеку.

Как отправить запрос через fsockopen для полного контроля?

fsockopen открывает сокет напрямую, позволяя вручную формировать HTTP-запрос. Применяется в низкоуровневых решениях, когда нужно обойти ограничения cURL или реализовать нестандартный протокол.


<?php
$fp = fsockopen('api.example.com', 80, $errno, $errstr, 30);
if (!$fp) {
    echo "Ошибка: $errstr ($errno)";
} else {
    $request = "GET /data HTTP/1.1\r\n";
    $request .= "Host: api.example.com\r\n";
    $request .= "Connection: Close\r\n\r\n";
    fwrite($fp, $request);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>
  

Проблемы: сложность обработки chunked encoding, ручное управление заголовками, отсутствие автоматического следования редиректам. Подходит только для простых случаев.

Как использовать Guzzle для современной работы с HTTP?

Guzzle - популярная PHP-библиотека, построенная на PSR-7 и PSR-18. Предоставляет удобный объектно-ориентированный интерфейс, поддержку middleware, асинхронных запросов и потоков. Рекомендуется для новых проектов.


<?php
require 'vendor/autoload.php';

use GuzzleHttp\Client;

$client = new Client(['base_uri' => 'https://api.example.com']);
$response = $client->get('/data', [
    'headers' => ['User-Agent' => 'MyApp']
]);
echo $response->getBody();
?>
  

Типичные ошибки:

  • Не установлена зависимость - требуется Composer.
  • Исключения при ошибках - Guzzle выбрасывает GuzzleHttp\Exception\ClientException для кодов 4xx.

Расширенные примеры работы с HTTP запросами в PHP

1. Многопоточные запросы с curl_multi

Для одновременной отправки нескольких запросов используйте curl_multi. Это ускоряет сбор данных с нескольких источников.

Пример

<?php
$urls = [
    'https://api.example.com/1',
    'https://api.example.com/2',
    'https://api.example.com/3'
];
$mh = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[$i] = $ch;
}
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo $response . "\n";
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);
?>
Вывод: данные с каждого URL последовательно (порядок не гарантируется).

2. Отправка запроса с авторизацией Bearer и обработкой JSON

Пример

<?php
$token = 'your_bearer_token';
$ch = curl_init('https://api.example.com/protected');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $token,
        'Accept: application/json'
    ]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode === 200) {
    $data = json_decode($response, true);
    print_r($data);
} else {
    echo "Ошибка: HTTP $httpCode";
}
?>
Вывод: массив с данными ответа.

3. Отправка POST запроса с файлом через cURL

Пример

<?php
$file = new CURLFile('/path/to/file.jpg', 'image/jpeg', 'file.jpg');
$ch = curl_init('https://api.example.com/upload');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => ['file' => $file],
    CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

4. Использование Guzzle с асинхронными запросами (Promise)

Пример

<?php
require 'vendor/autoload.php';
use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client();
$promises = [
    'one' => $client->getAsync('https://api.example.com/1'),
    'two' => $client->getAsync('https://api.example.com/2')
];
$results = Promise\Utils::settle($promises)->wait();
foreach ($results as $key => $result) {
    if ($result['state'] === 'fulfilled') {
        echo $key . ': ' . $result['value']->getBody() . "\n";
    } else {
        echo $key . ': ошибка - ' . $result['reason'] . "\n";
    }
}
?>

5. Настройка прокси через cURL

Пример

<?php
$ch = curl_init('https://api.example.com');
curl_setopt_array($ch, [
    CURLOPT_PROXY => 'http://proxy.example.com:8080',
    CURLOPT_PROXYUSERPWD => 'user:pass',
    CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>

6. Отправка запроса с помощью file_get_contents и проверка HTTP-кода

Пример

<?php
$options = [
    'http' => [
        'method' => 'GET',
        'ignore_errors' => true
    ]
];
$context = stream_context_create($options);
$result = file_get_contents('https://httpstat.us/404', false, $context);
if ($http_response_header) {
    preg_match('#HTTP/[0-9.]+ (\d+)#', $http_response_header[0], $matches);
    $status = (int)$matches[1];
    echo "HTTP код: $status\n";
}
echo $result;
?>
HTTP код: 404
404 Not Found

Отправка HTTP запроса на PHP - comments

En
Php отправка запроса (php)