Выбрать страницу

Продолжим тему работы с CURL на php. В четвертой части хотелось бы рассказать о работе с COOKIES. Вообще для работы с COOKIES есть стандартные средства, которые мы рассмотрим сегодня. А раз есть стандартные, значит, есть и нестандартные. На них мы обратим большую часть рассказа.

Изучаем curl COOKIES

Стандартный способ работы с COOKIES

Стандартные способ работы с COOKIES основан на использовании файла, это простой и в тоже время действенный способ. Но в нем есть некоторые недостатки, к основным недостаткам я бы отнес следующие:

  • сложность изменения COOKIES «на лету», в том числе доступ к ним и контроль;
  • в случае, когда может выполняться несколько копий скрипта, возникает проблема уникальности имени файла.

Для того чтобы ваш скрипт начал работать с COOKIES, необходимо дополнительно установить два свойства:

<?php
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); //Из какого файла читать
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt"); //В какой файл записывать
?>

CURLOPT_COOKIEFILE — Имя файла из которого читаются, данные cookie. Данные могут быть либо в формате Netscape, либо просто HTTP-заголовки.

CURLOPT_COOKIEJAR — Имя файла в который, записываются полученные данные cookie. Данные могут быть либо в формате Netscape, либо просто HTTP-заголовки.

В общем весь пример будет выглядеть так:

<?php
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yousoft.ru/');
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIEFILE, "cookie.txt"); 
curl_setopt($ch, CURLOPT_COOKIEJAR, "cookie.txt");
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://www.yousoft.ru)');
$data = curl_exec($ch);
curl_close($ch);
?>

При этом данные в файле ‘cookie.txt’ будут содержать примерно следующее:

# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

www.yousoft.ru	FALSE	/	FALSE	0	PHPSESSID	99764c90ef0e6ab84183938efcafd0f2

И для того, чтобы получить возможность прочить эти данные или изменить, нам нужно сделать парсинг этого файла. Который между прочим может быть и другого формата, а именно «просто HTTP-заголовки».

Нестандартный или ручной вариант

У этого варианта также есть и своим преимущества и свои недостатки. К недостатком можно отнести:

  • необходимость дополнительной обработки для получения и отправки COOKIES;
  • необходимы дополнительные действия для хранения COOKIES между запусками скрипта.

Как известно, COOKIES передается в заголовке HTTP ответ, следовательно, нам необходимо установить в настройках CURL установить свойство CURLOPT_HEADER в true, чтобы мы могли получить заголовки.

<?php
curl_setopt($ch, CURLOPT_HEADER, true);
?>

Следующим шагом нам необходимо разделить полученный результат на заголовок и тело (содержание) ответа. Для этого мы будем использовать функцию curl_getinfo, которая возвращает информацию о последней операции.

<?php
string curl_getinfo ( resource $ch [, int $opt] )
?>

Нас интересует параметр CURLINFO_HEADER_SIZE.

CURLINFO_HEADER_SIZE — Суммарный размер всех полученных заголовков

После получения размера заголовка мы можем разделить ответ на заголовок и тело (содержание).

<?php
$header=substr($data,0,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
$body=substr($data,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
?>

Теперь необходимо выделить непосредственно сами COOKIES, и сформировать строку для того чтобы можно было передать эти COOKIES в следующем запросе.

<?php
preg_match_all("/Set-Cookie: (.*?)=(.*?);/i",$header,$res);
$cookie='';
foreach ($res[1] as $key => $value) {
	//Здесь можно провести любую обработку COOKIES
	$cookie.= $value.'='.$res[2][$key].'; ';
};
?>

Для того, чтобы CURL передавал COOKIES при запросе нужно их установить. Для этого используем свойство CURLOPT_COOKIE.

CURLOPT_COOKIE — Содержимое заголовка «Cookie: «, который будет отправлен с HTTP запросом.

А, теперь совместим все вместе:

<?php
$cookie='';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://www.yousoft.ru/');
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_COOKIE,$cookie);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'PHP Bot (http://www.yousoft.ru)');
$data = curl_exec($ch);
$header=substr($data,0,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
$body=substr($data,curl_getinfo($ch,CURLINFO_HEADER_SIZE));
preg_match_all("/Set-Cookie: (.*?)=(.*?);/i",$header,$res);
$cookie='';
foreach ($res[1] as $key => $value) {
	$cookie.= $value.'='.$res[2][$key].'; ';
};
curl_close($ch);
?>

Какой именно способ использовать целиком и полностью зависит от решаемой задачи и ваших предпочтений. Каждый из них имеет свои преимущества и недостатки.

Не стесняйтесь оставлять комментарии и задавать вопросы, ведь во многом от вас зависит о чем будет написано в следующий раз.

Share This