Curl exec: примеры (PHP)

Использование функции curl_exec для HTTP-запросов
Раздел: Сетевые функции (cURL)
curl_exec(CurlHandle $handle): bool|string

Функция curl_exec() является частью библиотеки cURL в PHP и выполняет инициализированный сеанс cURL. Основное назначение — отправка HTTP-запросов и получение ответов от удалённых серверов. Использование актуально при взаимодействии с внешними API, загрузке файлов, автоматизации веб-запросов.

Аргументы функции

Функция принимает единственный параметр:

  • $ch (ресурс cURL) — обязательный аргумент, представляющий дескриптор сеанса, созданный функцией curl_init() и сконфигурированный с помощью curl_setopt().

Возвращаемое значение:

  • В случае успеха возвращает TRUE или данные ответа (в зависимости от настройки CURLOPT_RETURNTRANSFER).
  • При неудаче возвращает FALSE.
Базовые примеры применения
Простой GET-запрос
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if ($result === false) {
    echo 'Ошибка: ' . curl_error($ch);
} else {
    echo 'Успешный ответ';
}
curl_close($ch);
Успешный ответ
POST-запрос с данными
$ch = curl_init('https://api.example.com/submit');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, ['name' => 'John', 'age' => 30]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
Ответ от сервера в переменной $response
Запрос с заголовками
$ch = curl_init('https://api.example.com/secure');
$headers = [
    'Authorization: Bearer token123',
    'Content-Type: application/json'
];
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
Ответ с учётом переданных заголовков
Похожие функции в PHP

Для выполнения HTTP-запросов в PHP существуют альтернативные методы:

file_get_contents() с контекстом

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

$context = stream_context_create(['http' => ['method' => 'GET']]);
$result = file_get_contents('https://example.com', false, $context);
Расширение HTTP (pecl_http)

Предоставляет объектно-ориентированный интерфейс. Более современный подход, но требует установки дополнительного расширения.

$request = new HttpRequest('https://api.example.com', HttpRequest::METH_GET);
$request->send();
$response = $request->getResponseBody();
Guzzle и другие библиотеки

Сторонние композер-пакеты (Guzzle, Symfony HttpClient) предлагают удобный синтаксис и асинхронные запросы. Рекомендуются для сложных проектов.

// Пример с Guzzle
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.example.com');
Частые ошибки при работе
Отсутствие проверки на ошибки
$ch = curl_init('https://nonexistent-domain.example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch); // Вернёт false
echo $result; // Выведет пустоту
Не освобождение ресурсов
$ch = curl_init();
// ... много запросов в цикле без curl_close()
// Утечка ресурсов
Неправильная обработка тайм-аутов
$ch = curl_init('https://slow-server.example');
// Таймаут не установлен
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch); // Скрипт может зависнуть
Игнорирование SSL-сертификатов
$ch = curl_init('https://self-signed.example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch); // Ошибка SSL
Изменения в новых версиях PHP

Начиная с PHP 8.0, функция curl_exec() возвращает объект CurlHandle вместо ресурса. Сам ресурс cURL теперь инкапсулирован в объект.

Изменения в PHP 8.1

Добавлена поддержка распаковки заголовков при использовании CURLOPT_HEADERFUNCTION.

Изменения в PHP 8.2

Улучшена обработка тайм-аутов и добавлены новые константы для работы с протоколами.

Расширенные сценарии применения
Параллельные запросы с curl_multi
Пример php
$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);
} while ($running);
foreach ($handles as $ch) {
    $response = curl_multi_getcontent($ch);
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}
curl_multi_close($mh);
Загрузка файла с прогрессом
Пример php
function progressCallback($resource, $download_size, $downloaded) {
    if ($download_size > 0) {
        $percent = ($downloaded / $download_size) * 100;
        echo "Прогресс: " . round($percent, 2) . "%\n";
    }
}
$ch = curl_init('https://example.com/large-file.zip');
$fp = fopen('local.zip', 'w');
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'progressCallback');
curl_exec($ch);
curl_close($ch);
fclose($fp);
Имитация браузера с куками
Пример php
$ch = curl_init('https://example.com/login');
$cookieFile = 'cookies.txt';
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'user=admin&pass=123');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch); // Авторизация
curl_setopt($ch, CURLOPT_URL, 'https://example.com/dashboard');
curl_setopt($ch, CURLOPT_POST, false);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile);
$dashboard = curl_exec($ch); // Запрос с куками
curl_close($ch);
Аналоги в других языках
Python: библиотека requests
import requests
response = requests.get('https://api.example.com/data')
print(response.text)
JavaScript: fetch API
fetch('https://api.example.com/data')
  .then(response => response.json())
  .then(data => console.log(data));
Node.js: модуль axios
const axios = require('axios');
axios.get('https://api.example.com/data')
  .then(response => console.log(response.data));
Go: пакет net/http
resp, err := http.Get("https://api.example.com/data")
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
MySQL: функция LOAD_DATA

Позволяет загружать данные из внешнего файла или URL, но функциональность ограничена по сравнению с cURL.

LOAD DATA INFILE 'https://example.com/data.csv'
INTO TABLE table_name;

PHP curl_exec function comments

En
Curl exec Perform a cURL session