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

Использование curl_setopt для настройки cURL-сессий
Раздел: Сетевые функции (cURL)
curl_setopt(CurlHandle $handle, int $option, mixed $value): bool

Описание функции curl_setopt

Основное предназначение

Функция curl_setopt в PHP используется для настройки параметров сеанса cURL, который служит для выполнения HTTP-запросов к различным серверам. Она вызывается после инициализации сеанса с помощью curl_init и перед его исполнением через curl_exec.

Синтаксис и аргументы

Синтаксис: bool curl_setopt(resource $ch, int $option, mixed $value)

Параметры функции
  • $ch - дескриптор cURL, полученный из curl_init().
  • $option - константа CURLOPT_*, определяющая настраиваемый параметр.
  • $value - значение для установки параметра. Может быть строкой, числом, массивом или логическим значением в зависимости от конкретной опции.
Категории параметров
  • Основные параметры: CURLOPT_URL, CURLOPT_RETURNTRANSFER, CURLOPT_POST
  • Заголовки: CURLOPT_HTTPHEADER, CURLOPT_HEADER
  • Прокси и сеть: CURLOPT_PROXY, CURLOPT_TIMEOUT
  • Безопасность: CURLOPT_SSL_VERIFYPEER, CURLOPT_CAINFO
  • Загрузка файлов: CURLOPT_UPLOAD, CURLOPT_INFILE
  • Отладка: CURLOPT_VERBOSE, CURLOPT_STDERR

Простые примеры использования

Базовый GET-запрос
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com/data");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
?>
{"status":"success","data":[...]}
POST-запрос с данными
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "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);
$result = curl_exec($ch);
curl_close($ch);
?>
OK
Загрузка файла
<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://example.com/upload");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, [
    'file' => new CURLFile('document.pdf')
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
?>
File uploaded successfully

Альтернативные решения в PHP

Функция curl_setopt_array

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

$options = [
    CURLOPT_URL => 'https://example.com',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30
];
curl_setopt_array($ch, $options);
Расширение file_get_contents с контекстом

Для простых GET-запросов без сложных настроек можно использовать file_get_contents с потоковым контекстом.

$context = stream_context_create(['http' => [
    'method' => 'GET',
    'header' => 'User-Agent: MyBot'
]]);
$content = file_get_contents('https://example.com', false, $context);
Библиотека Guzzle

Современный объектно-ориентированный HTTP-клиент с более удобным синтаксисом и поддержкой асинхронных запросов.

$client = new GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.example.com/user', [
    'form_params' => ['name' => 'John']
]);

Аналоги в других языках программирования

Python: библиотека requests
import requests
response = requests.get('https://api.example.com/data')
print(response.json())
{'status': 'success', 'data': [...]}
JavaScript: fetch API
fetch('https://api.example.com/data')
    .then(response => response.json())
    .then(data => console.log(data));
{status: 'success', data: [...]}
Node.js: модуль axios
const axios = require('axios');
axios.post('https://api.example.com/submit', {
    name: 'John',
    age: 30
}).then(response => {
    console.log(response.data);
});
OK

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

Неверный тип параметра
curl_setopt($ch, CURLOPT_TIMEOUT, '30'); // Ошибка: ожидается число
Warning: curl_setopt() expects parameter 2 to be long, string given
Использование закрытого дескриптора
$ch = curl_init();
curl_close($ch);
curl_setopt($ch, CURLOPT_URL, 'https://example.com'); // Ошибка
Warning: curl_setopt(): supplied resource is not a valid cURL handle resource
Неправильные опции SSL
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Отключает проверку сертификата

Это создает уязвимость для MITM-атак. Рекомендуется использовать CURLOPT_CAINFO с указанием пути к корректному CA-буну.

Забытый CURLOPT_RETURNTRANSFER
$ch = curl_init('https://example.com');
$result = curl_exec($ch); // Результат выводится прямо в вывод
<!DOCTYPE html>... (содержимое страницы)

Изменения в последних версиях PHP

PHP 8.0

Изменена сигнатура функции: теперь параметры $ch и $option ожидают строгие типы (CurlHandle и int). Несоответствие типов вызывает TypeError вместо предупреждения.

PHP 7.3

Добавлена поддержка опции CURLOPT_ABSTRACT_UNIX_SOCKET для использования абстрактных Unix-сокетов.

PHP 7.0

Удалена поддержка устаревшей опции CURLOPT_SAFE_UPLOAD. Теперь загрузка файлов через @file всегда отключена, требуется использовать CURLFile.

Расширенные примеры применения

Параллельные запросы с 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_setopt($ch, CURLOPT_TIMEOUT, 10);
    curl_multi_add_handle($mh, $ch);
    $handles[] = $ch;
}

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

foreach ($handles as $ch) {
    $content = curl_multi_getcontent($ch);
    // Обработка результата
    curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
Запрос с кастомными заголовками и куками
Пример php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://api.example.com");
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Authorization: Bearer token123',
    'X-Custom-Header: value'
]);
curl_setopt($ch, CURLOPT_COOKIEJAR, '/path/to/cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/path/to/cookies.txt');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
FTP-загрузка с пассивным режимом
Пример php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "ftp://example.com/file.zip");
curl_setopt($ch, CURLOPT_USERPWD, "user:pass");
curl_setopt($ch, CURLOPT_FTP_USE_EPSV, true); // Пассивный режим
curl_setopt($ch, CURLOPT_UPLOAD, true);
curl_setopt($ch, CURLOPT_INFILE, fopen('local.zip', 'r'));
curl_setopt($ch, CURLOPT_INFILESIZE, filesize('local.zip'));
curl_exec($ch);
Отладка с сохранением лога
Пример php
$log = fopen('curl_debug.log', 'w');
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $log);
// ... выполнение запроса
fclose($log);
Использование прокси с аутентификацией
Пример php
curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com:3128');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxyuser:proxypass');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);

PHP curl_setopt function comments

En
Curl setopt Set an option for a cURL transfer