Cookie в cURL: настройка и передача данных
Основные подходы к работе с cookie в cURL
Как правильно передавать и сохранять cookie в PHP cURL?
Наиболее эффективный способ управления cookie в cURL - использование трёх специальных опций: CURLOPT_COOKIE, CURLOPT_COOKIEFILE и CURLOPT_COOKIEJAR. Они позволяют явно задавать строку cookie, загружать cookie из файла и сохранять полученные cookie в файл. Этот подход гарантирует корректную обработку всех атрибутов (домен, путь, флаги Secure/HttpOnly) и работает без ручного разбора заголовков.
$ch = curl_init('https://example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Задаём cookie строкой
curl_setopt($ch, CURLOPT_COOKIE, 'session_id=abc123; theme=dark');
// Загружаем cookie из файла (если нужно)
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/cookies.txt');
// После выполнения сохраняем новые cookie
curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/cookies.txt');
$response = curl_exec($ch);
curl_close($ch);
Php curl timeout (php curl таймаут)
В этом примере cookie передаются в запросе, а после получения ответа все новые cookie (включая установленные сервером) записываются в указанный файл. При повторных вызовах достаточно указать CURLOPT_COOKIEFILE, чтобы подгрузить сохранённые ранее данные.
Типичная ошибка - отсутствие прав на запись в файл для CURLOPT_COOKIEJAR. Проверьте, что каталог существует и доступен для записи. Также не забывайте указывать путь к файлу, иначе cURL может вернуть предупреждение.
Как передать определённый набор cookie вручную?
Используйте опцию CURLOPT_COOKIE со строкой, где пары имя=значение разделяются точкой с запятой и пробелом. Этот метод удобен для разовых запросов или когда cookie известны заранее.
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE, 'token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9; lang=ru');
$result = curl_exec($ch);
Php curl ssl (php curl ssl)
Проблема: если cookie содержат специальные символы (пробелы, точки с запятой), их нужно URL-кодировать. Кроме того, такой способ не учитывает атрибуты домена и пути - cURL просто отправит cookie как есть.
Как сохранить cookie между несколькими запросами (сессия)?
Для сохранения состояния сессии используйте комбинацию CURLOPT_COOKIEJAR и CURLOPT_COOKIEFILE. Сначала отправьте запрос на авторизацию, сохранив cookie в файл, затем в последующих запросах укажите тот же файл для загрузки.
$cookieFile = tempnam(sys_get_temp_dir(), 'cookies_');
// Первый запрос (логин)
$ch = curl_init('https://example.com/login');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => ['user' => 'admin', 'pass' => 'secret'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_COOKIEFILE => $cookieFile,
]);
$resp1 = curl_exec($ch);
// Второй запрос (авторизованный)
curl_setopt($ch, CURLOPT_URL, 'https://example.com/profile');
curl_setopt($ch, CURLOPT_POST, false);
$resp2 = curl_exec($ch);
curl_close($ch);
unlink($cookieFile);
Php curl ответ (ответ php curl)
Ошибка: если после первого запроса файл cookie не был создан (например, сервер не вернул Set-Cookie), последующие запросы не будут содержать нужных данных. Проверяйте содержимое файла после первого выполнения.
Как отличить сессионные cookie от постоянных?
Опция CURLOPT_COOKIESESSION даёт указание cURL игнорировать «сессионные» cookie (без Expires или Max-Age) при сохранении и загрузке. Если установить её в true, такие cookie не будут попадать в файл, что полезно при эмуляции новой сессии.
$ch = curl_init('https://example.com');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEFILE => '/tmp/session.txt',
CURLOPT_COOKIEJAR => '/tmp/session.txt',
]);
$data = curl_exec($ch);
Php curl authorization (php curl авторизация)
Следует помнить, что эта опция не влияет на обработку уже установленных cookie в памяти - она лишь фильтрует запись/чтение файла.
Как использовать cookie, если стандартные методы не подходят?
Можно вручную добавить заголовок Cookie через CURLOPT_HTTPHEADER. Однако cURL при этом не будет автоматически обрабатывать Set-Cookie из ответа, и cookie не обновятся.
$ch = curl_init('https://example.com');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Cookie: lang=en; session=abc123'],
]);
$result = curl_exec($ch);
Главный недостаток - полное отсутствие автоматического управления. Этот вариант оправдан только если нужно передать cookie без последующей обработки.
Практические примеры работы с cookie в cURL
Пример 1. Авторизация с последующим выполнением запросов
Полный цикл: отправка формы логина, сохранение cookie, получение защищённой страницы.
$cookieFile = '/tmp/curl_cookies.txt';
$ch = curl_init();
// 1. Логин
curl_setopt_array($ch, [
CURLOPT_URL => 'https://httpbin.org/post',
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['username' => 'test', 'password' => '123']),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIEJAR => $cookieFile,
CURLOPT_COOKIEFILE => $cookieFile,
]);
$loginResponse = curl_exec($ch);
// 2. Запрос к защищённому ресурсу
curl_setopt_array($ch, [
CURLOPT_URL => 'https://httpbin.org/cookies',
CURLOPT_POST => false,
CURLOPT_HTTPGET => true,
]);
$protectedPage = curl_exec($ch);
curl_close($ch);
echo $protectedPage;
unlink($cookieFile);
{
"cookies": {
"session": "abc123"
}
}
Пример 2. Передача нескольких cookie с разными атрибутами
Работа с cookie, где имена повторяются, но различаются домены или пути. cURL автоматически выбирает подходящие.
$ch = curl_init('https://httpbin.org/cookies');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIE => 'name=value1; name=value2; domain=.example.com; path=/',
]);
$result = curl_exec($ch);
// В запрос попадёт только последняя указанная cookie с именем name (value2)
// Для корректной передачи с разными путями используйте файл с NetScape-форматом
Пример 3. Использование CURLOPT_COOKIESESSION для новой сессии
При установке true сессионные cookie не сохраняются. Полезно для повторной чистки сессии.
$ch = curl_init('https://httpbin.org/cookies/set?session=new&persistent=1');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_COOKIESESSION => true,
CURLOPT_COOKIEJAR => '/tmp/nosession.txt',
CURLOPT_COOKIEFILE => '/tmp/nosession.txt',
]);
curl_exec($ch);
// В файле /tmp/nosession.txt будет только persistent (если у него есть Expires)
Пример 4. Обработка редиректов с cookie
Если используется CURLOPT_FOLLOWLOCATION, cookie передаются на все редиректы автоматически (при условии, что они сохраняются через CookieJar).
$ch = curl_init('https://httpbin.org/redirect-to?url=https://httpbin.org/cookies');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_FOLLOWLOCATION => true,
CURLOPT_COOKIE => 'test=value',
]);
$response = curl_exec($ch);
echo $response;
{
"cookies": {
"test": "value"
}
}
Пример 5. Cookie из памяти (без файла) с curl_share
В многопоточных запросах можно использовать общий дескриптор cookie через curl_share_init.
$share = curl_share_init();
curl_share_setopt($share, CURLSHOPT_SHARE, CURL_LOCK_DATA_COOKIE);
$ch1 = curl_init('https://httpbin.org/cookies/set?shared=yes');
$ch2 = curl_init('https://httpbin.org/cookies');
curl_setopt_array($ch1, [CURLOPT_RETURNTRANSFER => true, CURLOPT_SHARE => $share]);
curl_setopt_array($ch2, [CURLOPT_RETURNTRANSFER => true, CURLOPT_SHARE => $share]);
curl_exec($ch1);
$result2 = curl_exec($ch2);
echo $result2;
curl_share_close($share);
curl_close($ch1);
curl_close($ch2);
{
"cookies": {
"shared": "yes"
}
}
Пример 6. Ошибки при неверном формате файла cookie
Если файл cookie имеет неправильный NetScape-формат, cURL может проигнорировать его и не выдать ошибку. Убедитесь, что файл начинается с # Netscape HTTP Cookie File.
// Неправильный файл
file_put_contents('/tmp/bad_cookies.txt', 'session=abc');
$ch = curl_init('https://httpbin.org/cookies');
curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/bad_cookies.txt');
$result = curl_exec($ch);
// В ответе cookie не будет