Cookie в cURL: настройка и передача данных

Раздел: PHP -> HTTP запросы с 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 без последующей обработки.

- Php curl url (php curl url)
- Curl exec php (php curl exec)
- Curl setopt php (php curl setopt)

Практические примеры работы с 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 не будет

PHP cURL Cookie - comments

En
Php curl cookie (php)