Отправка данных через PHP: обзор методов и примеры кода

Раздел: Веб-разработка -> Сетевые запросы

Отправка сетевых запросов в PHP: основные подходы

Как выполнить HTTP-запрос с помощью cURL и обработать ответ?

Библиотека cURL является наиболее универсальным и часто используемым инструментом. Она поддерживает протоколы HTTP, HTTPS, FTP и позволяет тонко настраивать параметры запроса: заголовки, тело, таймауты, сертификаты.


<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(['key' => 'value']));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
$response = curl_exec($ch);
if ($response === false) {
    $error = curl_error($ch);
    // обработка ошибки
}
curl_close($ch);
?>
    

Php код отправки (код отправки php)

Пошаговое объяснение:

  • curl_init() создает новый сеанс cURL.
  • curl_setopt() задает опции: URL, возврат результата в строку, метод POST, тело запроса.
  • curl_exec() выполняет запрос и возвращает ответ или false при ошибке.
  • curl_error() возвращает текст последней ошибки.

Типичные проблемы и их решения

  • Ошибка SSL: добавьте curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); (не рекомендуется в production, лучше указать путь к CA-сертификатам).
  • Нет ответа: проверьте таймаут CURLOPT_TIMEOUT и наличие CURLOPT_RETURNTRANSFER.
  • Заголовки не отправляются: убедитесь, что массив передан в CURLOPT_HTTPHEADER правильно.

Как отправить GET-запрос с помощью file_get_contents и контекста?

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


<?php
$options = [
    'http' => [
        'method' => 'GET',
        'header' => "User-Agent: MyAgent\r\n"
    ]
];
$context = stream_context_create($options);
$result = file_get_contents('https://api.example.com/data', false, $context);
if ($result === false) {
    $error = error_get_last();
}
?>
    

Https отправить php (отправка https запроса через php)

Проблемы при использовании file_get_contents

  • Не работает для HTTPS: может потребоваться расширение OpenSSL. Убедитесь, что в php.ini включена поддержка.
  • Невозможно установить таймаут: используйте настройку 'timeout' => 5 в контексте.
  • Ошибка при редиректе: по умолчанию редиректы не обрабатываются. Добавьте 'follow_location' => 1 в опции контекста.

Как отправлять запросы вручную через сокеты (fsockopen)?

Низкоуровневый метод fsockopen() позволяет самостоятельно формировать HTTP-сообщение. Используется редко, но даёт полный контроль над процессом. Подходит для нестандартных протоколов или когда нет cURL.


<?php
$fp = fsockopen('api.example.com', 80, $errno, $errstr, 10);
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);
    $response = '';
    while (!feof($fp)) {
        $response .= fgets($fp, 1024);
    }
    fclose($fp);
}
?>
    

Php curl файл (работа с curl в php (загрузка файлов))

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

  • Ошибка соединения: проверьте порт (80 для HTTP, 443 для HTTPS). Для HTTPS используйте fsockopen('ssl://...', 443).
  • Неполный ответ: необходимо читать до конца потока, пока feof() не вернет true, либо разбирать заголовки Content-Length.

Как использовать библиотеку Guzzle для сложных запросов?

Guzzle - это популярный PHP-клиент для HTTP. Он предоставляет объектно-ориентированный интерфейс, поддерживает PSR-7, асинхронные запросы, middleware и автоматическую обработку ошибок.


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

use GuzzleHttp\Client;

$client = new Client([
    'base_uri' => 'https://api.example.com',
    'timeout' => 10.0,
]);

try {
    $response = $client->request('POST', '/data', [
        'json' => ['key' => 'value'],
        'headers' => ['X-Custom' => 'test']
    ]);
    $body = $response->getBody()->getContents();
} catch (\GuzzleHttp\Exception\GuzzleException $e) {
    echo 'Ошибка: ' . $e->getMessage();
}
?>
    

Возможные трудности с Guzzle

  • Требуется Composer: установка через composer require guzzlehttp/guzzle.
  • Версия PHP: Guzzle 7 требует PHP 7.2.5+.
  • Ошибки SSL: настройка verify опции (false или путь к сертификату).

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

Пример с cURL: отправка JSON и получение заголовков ответа

Пример

<?php
$ch = curl_init('https://httpbin.org/post');
$payload = json_encode(['name' => 'John', 'age' => 30]);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Accept: application/json',
        'Authorization: Bearer some_token'
    ],
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HEADER => true, // вернуть и заголовки
    CURLOPT_TIMEOUT => 30,
]);
$response = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$headers = substr($response, 0, $header_size);
$body = substr($response, $header_size);
curl_close($ch);
echo "Заголовки:\n" . $headers . "\n\n";
echo "Тело ответа:\n" . $body;
?>
    

Результат (пример вывода):

Заголовки:
HTTP/1.1 200 OK
Content-Type: application/json
...

Тело ответа:
{"args":{}...}
    

Пример с file_get_contents: POST с multipart/form-data

Пример

<?php
$boundary = '----' . md5(time());
$fields = [
    'field1' => 'value1',
    'field2' => 'value2'
];
$files = [
    'file' => [
        'filename' => 'image.jpg',
        'content' => file_get_contents('image.jpg'),
        'mime' => 'image/jpeg'
    ]
];

$body = '';
foreach ($fields as $name => $value) {
    $body .= "--$boundary\r\n";
    $body .= "Content-Disposition: form-data; name=\"$name\"\r\n\r\n";
    $body .= "$value\r\n";
}
foreach ($files as $name => $file) {
    $body .= "--$boundary\r\n";
    $body .= "Content-Disposition: form-data; name=\"$name\"; filename=\"{$file['filename']}\"\r\n";
    $body .= "Content-Type: {$file['mime']}\r\n\r\n";
    $body .= $file['content'] . "\r\n";
}
$body .= "--$boundary--\r\n";

$options = [
    'http' => [
        'method' => 'POST',
        'header' => "Content-Type: multipart/form-data; boundary=$boundary\r\n",
        'content' => $body
    ]
];
$context = stream_context_create($options);
$result = file_get_contents('https://httpbin.org/post', false, $context);
echo $result;
?>
    

Результат: ответ сервера, содержащий переданные данные.

Пример fsockopen: HTTPS-запрос с проверкой сертификата

Пример

<?php
$host = 'api.example.com';
$port = 443;
$timeout = 5;
$context = stream_context_create([
    'ssl' => [
        'verify_peer' => true,
        'cafile' => '/etc/ssl/certs/ca-certificates.crt',
        'verify_peer_name' => true
    ]
]);
$fp = stream_socket_client("ssl://$host:$port", $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context);
if (!$fp) {
    die("Ошибка: $errstr ($errno)");
}
$request = "GET /data HTTP/1.1\r\n";
$request .= "Host: $host\r\n";
$request .= "Connection: close\r\n\r\n";
fwrite($fp, $request);
$response = '';
while (!feof($fp)) {
    $response .= fgets($fp, 1024);
}
fclose($fp);
echo $response;
?>
    

Результат: полный HTTP-ответ (заголовки + тело).

Пример Guzzle: асинхронные запросы с Promise

Пример

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

use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client(['base_uri' => 'https://httpbin.org']);
$promises = [
    'request1' => $client->getAsync('/delay/2'),
    'request2' => $client->postAsync('/post', ['json' => ['key' => 'value']]),
];
$results = Promise\Utils::settle($promises)->wait();

foreach ($results as $key => $result) {
    if ($result['state'] === 'fulfilled') {
        $response = $result['value'];
        echo "$key: " . $response->getStatusCode() . "\n";
    } else {
        echo "$key rejected: " . $result['reason'] . "\n";
    }
}
?>
    

Результат: параллельное выполнение двух запросов, вывод статусов.

Код отправки PHP - comments

En
Php код отправки (php)