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

Раздел: Разработка на PHP -> HTTP запросы

Основы работы с URL и HTTP в PHP

PHP предоставляет несколько способов для отправки HTTP запросов и работы с URL. Выбор зависит от требований проекта: наличие расширений, производительность, удобство. Рассмотрим основные подходы.

Как наиболее эффективно выполнять HTTP запросы в PHP?

cURL – это мощная библиотека, которая поддерживает множество протоколов, гибкую настройку, обработку ошибок и высокую производительность. Рекомендуется для промышленного использования.

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


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // для тестирования
$response = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Ошибка: ' . curl_error($ch);
}
curl_close($ch);
echo $response;

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

Пояснения:

  • curl_init создает дескриптор сеанса.
  • CURLOPT_URL устанавливает целевой URL.
  • CURLOPT_RETURNTRANSFER возвращает результат в переменную вместо прямого вывода.
  • CURLOPT_SSL_VERIFYPEER отключает проверку SSL‑сертификата (не рекомендуется в production).
  • curl_exec выполняет запрос.
  • curl_errno / curl_error проверяют наличие ошибок.
  • curl_close закрывает сеанс.

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

  • Ошибка SSL (Certificates issues) – требуется указать правильный CA bundle или отключить проверку.
  • Таймаут соединения – можно увеличить CURLOPT_CONNECTTIMEOUT.
  • Пустой ответ при CURLOPT_RETURNTRANSFER = false.
  • Расширение cURL не установлено – проверьте phpinfo().

Пример POST запроса с JSON:


$data = ['name' => 'John', 'email' => 'john@example.com'];
$json = json_encode($data);

$ch = curl_init('https://api.example.com/users');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $json,
    CURLOPT_HTTPHEADER => [
        'Content-Type: application/json',
        'Content-Length: ' . strlen($json)
    ]
]);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP-код: $httpCode\n";
echo $response;

Php file http (работа с файлами по http в php)

Как отправить HTTP запрос без cURL, используя только встроенные функции?

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


$url = 'https://api.example.com/data';
$options = [
    'http' => [
        'method' => 'GET',
        'header' => "User-Agent: PHP\r\nAccept: application/json"
    ]
];
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
if ($response === false) {
    echo 'Ошибка при получении данных';
} else {
    echo $response;
}

Http content php (отправка контента по http в php)

Проблемы:

  • Требуется опция allow_url_fopen включена в php.ini.
  • Сложно обрабатывать редиректы, куки, многопоточность.
  • Нет встроенной обработки ошибок HTTP (например, 404).

Пример POST запроса с контекстом:


$data = http_build_query(['name' => 'John', 'email' => 'john@example.com']);
$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/users', false, $context);
echo $result;

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

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

Guzzle – это современный PHP HTTP-клиент, поддерживающий PSR-7, асинхронные запросы, middleware и легко интегрируется с фреймворками. Устанавливается через Composer: composer require guzzlehttp/guzzle.


use GuzzleHttp\Client;

$client = new Client(['base_uri' => 'https://api.example.com/']);
$response = $client->get('/data', [
    'headers' => ['Accept' => 'application/json']
]);
echo $response->getStatusCode();
echo $response->getBody();

Php post json (php: отправка post-запроса с json)

Распространённые ошибки:

  • Не установлен Composer или autoload.
  • Ошибка SSL – можно отключить проверку: 'verify' => false.
  • Таймауты – используются опции timeout и connect_timeout.

Пример POST запроса с Guzzle:


use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client();
try {
    $response = $client->post('https://api.example.com/users', [
        'json' => ['name' => 'Jane', 'email' => 'jane@example.com'],
        'timeout' => 10
    ]);
    echo $response->getBody();
} catch (RequestException $e) {
    echo 'HTTP-ошибка: ' . $e->getCode();
}

Request php (обработка http запросов в php)

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

Расширение pecl_http предоставляет класс HttpRequest для выполнения запросов. Устанавливается через PECL. В современных версиях PHP оно не так распространено, но может быть полезно в легаси-проектах.


$req = new HttpRequest('https://api.example.com/data', HttpRequest::METH_GET);
$req->setHeaders(['Accept' => 'application/json']);
try {
    $req->send();
    echo $req->getResponseBody();
} catch (HttpException $ex) {
    echo 'Ошибка: ' . $ex->getMessage();
}

Проблемы:

  • Расширение не входит в стандартную поставку PHP, требует установки.
  • Плохо поддерживается в новых версиях PHP.
  • Ограниченная документация.
- Php post request (post запрос в php)
- Home php id index (передача параметра id в home.php)
- Php redirect (редирект в php)

Расширенные примеры работы с URL и HTTP

Ниже приведены примеры, которые помогут решить частые задачи при разработке.

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

Позволяет выполнять несколько запросов одновременно для ускорения работы.

Пример

$urls = ['https://api1.example.com', 'https://api2.example.com'];
$mh = curl_multi_init();
$handles = [];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    echo "Ответ от " . curl_getinfo($ch, CURLINFO_EFFECTIVE_URL) . ": " . substr($response, 0, 100) . "\n";
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);

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

Ответ от https://api1.example.com: {"status":"ok"}...
Ответ от https://api2.example.com: <html>...

2. Отправка multipart/form-data с файлом (cURL)

Для загрузки файлов используется класс CURLFile.

Пример

$file = new CURLFile('/path/to/file.jpg', 'image/jpeg', 'file.jpg');
$data = ['file' => $file, 'description' => 'Test upload'];

$ch = curl_init('https://api.example.com/upload');
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $data,
    CURLOPT_RETURNTRANSFER => true
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

3. Работа с редиректами и ограничение их количества

Пример

$ch = curl_init('http://example.com/redirect');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_FOLLOWLOCATION => true,
    CURLOPT_MAXREDIRS => 5,
    CURLOPT_AUTOREFERER => true,
]);
$response = curl_exec($ch);
$finalUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
echo "Конечный URL: $finalUrl\n";
echo $response;
curl_close($ch);

4. Аутентификация Basic и Digest с помощью cURL

Пример

$ch = curl_init('https://api.example.com/protected');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPAUTH => CURLAUTH_BASIC,
    CURLOPT_USERPWD => 'username:password'
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;

5. Работа с куки: сохранение и отправка

Пример

$cookieFile = '/tmp/cookies.txt';
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEJAR => $cookieFile,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => 'user=admin&pass=123'
]);
$response = curl_exec($ch);
curl_close($ch);

$ch2 = curl_init('https://example.com/profile');
curl_setopt_array($ch2, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_COOKIEFILE => $cookieFile,
]);
$response2 = curl_exec($ch2);
curl_close($ch2);
echo $response2;

6. Парсинг URL и формирование строки запроса

Пример

$url = 'https://example.com/page?param1=value1¶m2=value2#fragment';
$parsed = parse_url($url);
print_r($parsed);

parse_str($parsed['query'] ?? '', $query);
$query['new'] = 'value3';
$newQuery = http_build_query($query);
$newUrl = $parsed['scheme'] . '://' . $parsed['host'] . $parsed['path'] . '?' . $newQuery;
echo $newUrl;

Результат (пример):

Array
(
    [scheme] => https
    [host] => example.com
    [path] => /page
    [query] => param1=value1¶m2=value2
    [fragment] => fragment
)
https://example.com/page?param1=value1¶m2=value2&new=value3

7. Использование Guzzle для асинхронных запросов

Пример

use GuzzleHttp\Client;
use GuzzleHttp\Promise;

$client = new Client();
$promises = [
    'api1' => $client->getAsync('https://api1.example.com'),
    'api2' => $client->getAsync('https://api2.example.com'),
];
$results = Promise\settle($promises)->wait();

foreach ($results as $key => $result) {
    if ($result['state'] === 'fulfilled') {
        echo "$key: " . $result['value']->getBody() . "\n";
    } else {
        echo "$key: ошибка - " . $result['reason'] . "\n";
    }
}

PHP работа с URL и HTTP - comments

En
Php url http (php)