Curl setopt: примеры (PHP)
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
Простые примеры использования
<?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":[...]}<?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
Позволяет установить несколько параметров одновременно через массив, что повышает читаемость кода при большом количестве настроек.
$options = [
CURLOPT_URL => 'https://example.com',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 30
];
curl_setopt_array($ch, $options);Для простых GET-запросов без сложных настроек можно использовать file_get_contents с потоковым контекстом.
$context = stream_context_create(['http' => [
'method' => 'GET',
'header' => 'User-Agent: MyBot'
]]);
$content = file_get_contents('https://example.com', false, $context);Современный объектно-ориентированный HTTP-клиент с более удобным синтаксисом и поддержкой асинхронных запросов.
$client = new GuzzleHttp\Client();
$response = $client->request('POST', 'https://api.example.com/user', [
'form_params' => ['name' => 'John']
]);Аналоги в других языках программирования
import requests
response = requests.get('https://api.example.com/data')
print(response.json()){'status': 'success', 'data': [...]}fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data));{status: 'success', data: [...]}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
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // Отключает проверку сертификатаЭто создает уязвимость для MITM-атак. Рекомендуется использовать CURLOPT_CAINFO с указанием пути к корректному CA-буну.
$ch = curl_init('https://example.com');
$result = curl_exec($ch); // Результат выводится прямо в вывод<!DOCTYPE html>... (содержимое страницы)
Изменения в последних версиях PHP
Изменена сигнатура функции: теперь параметры $ch и $option ожидают строгие типы (CurlHandle и int). Несоответствие типов вызывает TypeError вместо предупреждения.
Добавлена поддержка опции CURLOPT_ABSTRACT_UNIX_SOCKET для использования абстрактных Unix-сокетов.
Удалена поддержка устаревшей опции CURLOPT_SAFE_UPLOAD. Теперь загрузка файлов через @file всегда отключена, требуется использовать CURLFile.
Расширенные примеры применения
$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);$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);$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);$log = fopen('curl_debug.log', 'w');
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_STDERR, $log);
// ... выполнение запроса
fclose($log);curl_setopt($ch, CURLOPT_PROXY, 'proxy.example.com:3128');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxyuser:proxypass');
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);