Curl exec: примеры (PHP)
curl_exec(CurlHandle $handle): bool|stringФункция curl_exec() является частью библиотеки cURL в PHP и выполняет инициализированный сеанс cURL. Основное назначение — отправка HTTP-запросов и получение ответов от удалённых серверов. Использование актуально при взаимодействии с внешними API, загрузке файлов, автоматизации веб-запросов.
Функция принимает единственный параметр:
- $ch (ресурс cURL) — обязательный аргумент, представляющий дескриптор сеанса, созданный функцией curl_init() и сконфигурированный с помощью curl_setopt().
Возвращаемое значение:
- В случае успеха возвращает TRUE или данные ответа (в зависимости от настройки CURLOPT_RETURNTRANSFER).
- При неудаче возвращает FALSE.
$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);Успешный ответ
$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);Ответ с учётом переданных заголовков
Для выполнения HTTP-запросов в PHP существуют альтернативные методы:
Подходит для простых GET-запросов. Не требует расширения cURL, но имеет ограниченные возможности настройки.
$context = stream_context_create(['http' => ['method' => 'GET']]);
$result = file_get_contents('https://example.com', false, $context);Предоставляет объектно-ориентированный интерфейс. Более современный подход, но требует установки дополнительного расширения.
$request = new HttpRequest('https://api.example.com', HttpRequest::METH_GET);
$request->send();
$response = $request->getResponseBody();Сторонние композер-пакеты (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); // Скрипт может зависнуть$ch = curl_init('https://self-signed.example');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch); // Ошибка SSLНачиная с PHP 8.0, функция curl_exec() возвращает объект CurlHandle вместо ресурса. Сам ресурс cURL теперь инкапсулирован в объект.
Добавлена поддержка распаковки заголовков при использовании CURLOPT_HEADERFUNCTION.
Улучшена обработка тайм-аутов и добавлены новые константы для работы с протоколами.
$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);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);$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);import requests
response = requests.get('https://api.example.com/data')
print(response.text)fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));const axios = require('axios');
axios.get('https://api.example.com/data')
.then(response => console.log(response.data));resp, err := http.Get("https://api.example.com/data")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)Позволяет загружать данные из внешнего файла или URL, но функциональность ограничена по сравнению с cURL.
LOAD DATA INFILE 'https://example.com/data.csv'
INTO TABLE table_name;