- Работа с cookie в PHP
- Установка cookies
- Пример установки cookies:
- Пример установки массива в cookies:
- или
- Чтение cookies
- Например, вывести одно конкретное значение cookie:
- Вывести массив:
- Удаление cookies
- Удалить все cookie
- setcookie
- Список параметров
- Возвращаемые значения
- Примеры
- Список изменений
- Примечания
- Смотрите также
- How to Set Cookies for Multiple Subdomains
- What is Cookies in PHP?
- How to Set a Cookie in PHP
Работа с cookie в PHP
Cookies – это механизм хранения данных браузером для отслеживания или идентификации возвращающихся посетителей. В PHP работа с Cookie происходит следующем образом:
Установка cookies
Установка cookies производится функцией setcookie или setrawcookie (без URL-кодирования значения).
Cookie передаются клиенту вместе с другими HTTP-заголовками, поэтому setcookie() должна быть вызвана до вывода в браузер.
setcookie($name, $value, $expires, $path, $domain, $secure, $httponly);
$expires – время жизни (метка времени Unix), если 0 или пропустить аргумент, cookie будут действовать до закрытия браузера.
$path – путь к директории, из которой будут доступны cookie. Если задать ‘/’, cookie будут доступны во всем домене.
$domain – домен, которому доступны cookie. Например, ‘ www.example.com ‘ сделает cookie доступными только в нём. Для того, чтобы сделать cookie доступными для всего домена и поддоменов, нужно указать имя домена ‘ example.com ‘.
$secure – при true значения cookie будут доступны только по HTTPS.
$httponly – при true , cookie будут доступны только через HTTP-протокол.
Пример установки cookies:
// До закрытия браузера setcookie('test-1', 'Значение 1'); // На 1 месяц setcookie('test-1', 'Значение 1', strtotime('+30 days'));
Пример установки массива в cookies:
setcookie('test-2[0]', 'Значение 1'); setcookie('test-2[1]', 'Значение 2'); setcookie('test-2[2]', 'Значение 3');
или
$array = array( 'Значение 1', 'Значение 2', 'Значение 3', ); foreach ($array as $i => $row)
Альтернативная вариант доступен с PHP 7.3.0:
setcookie($name, $value, $options);
Где $options массив, который может содержать любой из ключей: expires , path , domain , secure , httponly и samesite .
Значение элемента samesite может быть либо None , Lax или Strict .
setcookie('test-1', 'Значение 1', array( 'expires' => time() + 60 * 60 * 24 * 30, 'path' => '/', 'domain' => 'example.com', 'secure' => true, 'httponly' => true, 'samesite' => 'None' ));
Чтение cookies
После передачи клиенту cookie станут доступны через глобальный массив $_COOKIE при следующей загрузке страницы. Значения cookie также есть в массиве $_REQUEST .
Например, вывести одно конкретное значение cookie:
Вывести массив:
Array ( [0] => Значение 1 [1] => Значение 2 [2] => Значение 3 )
Удаление cookies
Чтобы удалить cookies достаточно в setcookie() , в аргументе $expires указать какое-либо прошедшее время. Например 1 час:
setcookie('test-1', '', time() - 3600);
Удалить все cookie
if (isset($_SERVER['HTTP_COOKIE'])) < $cookies = explode(';', $_SERVER['HTTP_COOKIE']); foreach($cookies as $cookie) < $parts = explode('=', $cookie); $name = trim($parts[0]); setcookie($name, '', time() - 3600); >>
setcookie
setcookie() задает cookie, которое будет передано клиенту вместе с другими HTTP заголовками. Как и любой другой заголовок, cookie должны передаваться до того как будут выведены какие-либо другие данные скрипта (это ограничение протокола). Это значит, что в скрипте вызовы этой функции должны располагаться прежде остального вывода, включая вывод тэгов и , а также пустые строки и пробелы.
После передачи клиенту cookie станут доступны через массивы $_COOKIE и $HTTP_COOKIE_VARS при следующей загрузке страницы. Следует иметь в виду, что суперглобальные переменные, такие как $_COOKIE , стали доступны только в PHP 4.1.0. Значения cookie также есть в $_REQUEST .
Список параметров
Все аргументы, за исключением name , являются необязательными. Если нужно пропустить какой-либо аргумент, можно вместо него поставить пустую строку («»). Это не относится к аргументу expire . Так как он принимает значение типа integer, для его замены пустая строка не подходит. Используйте вместо нее ноль (0).
» RFC 6265 дает конкретные указания, как нужно интерпретировать каждый из параметров setcookie() . name
Значение cookie. Это значение будет сохранено на клиентском компьютере; не записывайте в cookie секретные данные. Значение присвоенное cookie c именем name , допустим, ‘cookiename’, будет доступно через $_COOKIE[‘cookiename’] .
Время, когда срок действия cookie истекает. Это метка времени Unix, то есть это количество секунд с начала эпохи. Другими словами, желательно задавать это время с помощью функции time() , прибавляя время в секундах, через которое срок действия cookie должен истечь. Либо можно воспользоваться функцией mktime() . time()+60*60*24*30 установит срок действия cookie 30 дней. Если задать 0 или пропустить этот аргумент, срок действия cookie истечет с окончанием сессии (при закрытии броузера).
Замечание:
Можно заметить, что expire принимает в качестве значения метку времени Unix, а хранит его в формате Wdy, DD-Mon-YYYY HH:MM:SS GMT. PHP делает внутреннее преобразование автоматически.
Путь к директории на сервере, из которой будут доступны cookie. Если задать ‘/’, cookie будут доступны во всем домене domain . Если задать ‘/foo/’, cookie будут доступны только из директории /foo/ и всех ее поддиректорий (например, /foo/bar/) домена domain . По умолчанию значением является текущая директория, в которой cookie устанавливается.
Домен, которому доступны cookie. Задание домена ‘www.example.com’ сделает cookie доступными в поддомене www и поддоменах более высоких порядков. Cookie доступные низким уровням, таким как ‘example.com’, будут доступны во всех поддоменах высших уровней, с том числе ‘www.example.com’. Старые броузеры, следующие устаревшим нормативам » RFC 2109, могут требовать . перед доменом, чтобы включались все поддомены.
Указывает на то, что значение cookie должно передаваться от клиента по защищенному HTTPS соединению. Если задано TRUE , cookie от клиента будет передано на сервер, только если установлено защищенное соединение. При передаче cookie от сервера клиенту следить за тем, чтобы cookie этого типа передавались по защищенному каналу, должен программист веб-сервера (стоит обратить внимание на $_SERVER[«HTTPS»] ).
Если задано TRUE , cookie будут доступны только через HTTP протокол. То есть cookie в этом случае не будут доступны скриптовым языкам, вроде JavaScript. Эта возможность была предложена в качестве меры, эффективно снижающей количество краж личных данных посредством XSS атак (несмотря на то, что поддерживается не всеми броузерами). Стоит однако же отметить, что вокруг этой возможности часто возникают споры о ее эффективности и целесообразности. Аргумент добавлен в PHP 5.2.0. Может принимать значения TRUE или FALSE .
Возвращаемые значения
Если перед вызовом функции клиенту уже передавался какой-либо вывод (тэги, пустые строки, пробелы, текст и т.п.), setcookie() вызовет отказ и вернет FALSE . Если setcookie() успешно отработает, то вернет TRUE . Это, однако, не означает, что клиентское приложение (броузер) правильно приняло и обработало cookie.
Примеры
Ниже представлено несколько примеров, как отправлять cookie:
Пример #1 Пример использования setcookie()
setcookie ( «TestCookie» , $value );
setcookie ( «TestCookie» , $value , time ()+ 3600 ); /* срок действия 1 час */
setcookie ( «TestCookie» , $value , time ()+ 3600 , «/~rasmus/» , «example.com» , 1 );
?>
Стоит отметить, что значение cookie перед отправкой клиенту подвергается URL-кодированию. При обратном получении значение cookie декодируется и помещается в переменную, с тем же именем, что и имя cookie. Если вы не хотите, чтобы значения кодировались, используйте функцию setrawcookie() (работает в PHP 5). Посмотреть содержимое наших тестовых cookie можно, запустив один из следующих примеров:
// Вывести одно конкретное значение cookie
echo $_COOKIE [ «TestCookie» ];
echo $HTTP_COOKIE_VARS [ «TestCookie» ];
?php
// В целях тестирования и отладки может пригодиться вывод всех cookie
print_r ( $_COOKIE );
?>
Пример #2 Пример удаления cookie посредством setcookie()
Чтобы удалить cookie достаточно в качестве срока действия указать какое-либо время в прошлом. Это запустит механизм броузера, удаляющий истекшие cookie. В примерах ниже показано, как удалить cookie, заданные в предыдущих примерах:
// установка даты истечения срока действия на час назад
setcookie ( «TestCookie» , «» , time () — 3600 );
setcookie ( «TestCookie» , «» , time () — 3600 , «/~rasmus/» , «example.com» , 1 );
?>?php
Пример #3 setcookie() и массивы
Имеется возможность помещать в cookie массивы. Для этого каждому cookie нужно дать имя в соответствии с правилами именования массивов. Такая возможность позволяет поместить столько значений, сколько имеется элементов в массиве. При обратном получении все эти значения будут помещены в массив с именем этого cookie:
// отправка cookie
setcookie ( «cookie[three]» , «cookiethree» );
setcookie ( «cookie[two]» , «cookietwo» );
setcookie ( «cookie[one]» , «cookieone» );
?php
// после перезагрузки страницы, выведем cookie
if (isset( $_COOKIE [ ‘cookie’ ])) foreach ( $_COOKIE [ ‘cookie’ ] as $name => $value ) $name = htmlspecialchars ( $name );
$value = htmlspecialchars ( $value );
echo » $name : $value
\n» ;
>
>
?>
Результат выполнения данного примера:
three : cookiethree two : cookietwo one : cookieone
Список изменений
Версия | Описание |
---|---|
5.5.0 | Атрибут Max-Age теперь добавляется в заголовок Set-Cookie, отправляемый клиенту. |
5.2.0 | Добавлен параметр httponly . |
Примечания
Замечание:
Чтобы иметь возможность отправлять вывод скрипта до вызова этой функции, можно воспользоваться буферизацией. В этом случае весь вывод скрипта помещается в буфер на сервере и остается там, пока вы явно не отправите его броузеру. Управление буферизацией осуществляется функциями ob_start() и ob_end_flush() в скрипте, либо можно задать директиву output_buffering в файле php.ini или конфигурационных файлах сервера.
Замечание:
Если PHP директива register_globals включена (задано значение on), значения cookie помимо всего прочего будут помещаться в переменные. Для примеров выше будет существовать переменная $TestCookie . Тем не менее, рекомендуется использовать $_COOKIE .
- Cookie станут видимыми только после перезагрузки страницы, для которой они должны быть видны. Для проверки, правильно ли cookie установились, проверьте их при следующей загрузке страницы до истечения срока их действия. Срок действия cookie задается в параметре expire . Удобно проверять существование cookie простым вызовом print_r($_COOKIE);.
- При удалении cookie должны быть заданы те же параметры, что и при установке. Если в качестве значения задать пустую строку или FALSE , а остальные параметры задать соответственно предыдущему вызову, установившему cookie, тогда cookie c заданным именем будет удалено с клиентской машины. Внутренне это выглядит так: cookie присваивается значение ‘deleted’, а срок действия переносится на год в прошлое.
- Так как установка значения FALSE приведет к удалению cookie, не следует задавать cookie значения булевого типа. Вместо этого можно использовать 0 для FALSE и 1 для TRUE .
- Cookie можно именовать, как массивы, и они будут доступны в PHP скрипте, как массивы, но на пользовательской машине они будут храниться в виде отдельных записей. Для задания cookie c множеством имен и значений желательно использовать функцию explode() . Не рекомендуется для этих целей использовать функцию serialize() , так как это негативно сказывается на безопасности скрипта.
При многократных вызовах setcookie() функции выполняются в том порядке, в котором вызывались.
Смотрите также
- header() — Отправка HTTP заголовка
- setrawcookie() — Посылает cookie не преобразовывая значение
- раздел cookies
- » RFC 6265
- » RFC 2109
How to Set Cookies for Multiple Subdomains
How to set cookies for multiple subdomains. In this tutorial, I am going to explain how to set and read a cookie from multiple subdomains.
HTTP is a stateless protocol. Stateless means client request a resource, a server respond to that request remembering the request later. So how website knows whether you are a unique user or you have visited previously. How they remember your previous browsing history, language preference etc.
How to Set Cookies for Multiple subdomains
The answer is they simply store information in a user browser through cookies. When you visit next time on a same website the cookie information is sent via HTTP Header to the server. Before going further let’s understand what is cookies.
What is Cookies in PHP?
Cookies are simple text files which store some information on a user computer. The information may be website language preference, visit count, last visit information etc. Cookies set on one domain or website cannot be accessed by other domains. For security point of view, it is safe. So cookie set by webrewrite.com cannot be accessed by example.com.
The size of Cookie cannot be more than 4096 Bytes which is 4 KB.
How to Set a Cookie in PHP
In PHP, setcookie() method is used to set a cookie.