Ответ 1
К сожалению, Expires является абсолютной датой и зависит от локальной даты пользовательских агентов. Как вы правильно это сделали, это может привести к неточному истечению срока действия cookie.
Это также является причиной первой стандартизации IETF исходного предложения Netscapes, заменил дату абсолютного истечения на относительную дату истечения срока действия, атрибут Max-Age, который указывал время в дельта-секундах с момента, когда cookie был выпущен. RFC 2965, который устарел RFC 2109, сделал то же самое. Так же, как RFC 6265, это самая последняя спецификация файлов cookie.
Cookies в соответствии с RFC 6265 также позволяют указывать дату истечения срока действия как относительной датой с использованием Max-Age, так и абсолютной датой с использованием Expires, последняя в первую очередь для обратной совместимости:
Если cookie имеет атрибут Max-Age и Expires, атрибут Max-Age имеет приоритет и контролирует дату истечения срока действия файла cookie.
Итак, вы можете написать свою собственную функцию, которая имитирует это поведение:
$maxage = 12345;
$expires = date(DATE_COOKIE, time()+$maxage);
header("Set-Cookie: $name=$value, Expires=$expires, Max-Age=$maxage, …");
Вот пример функции:
function set_cookie($name, $value=null, $maxage=null, $path=null, $domain=null, $secure=false, $httponly=false) {
$cookie = rawurlencode($name) . '=' . rawurlencode($value);
$attributes = array();
if (!is_null($maxage)) {
$maxage = intval($maxage);
$attributes[] = 'Expires='.date(DATE_COOKIE, $maxage > 0 ? time()+$maxage : 0);
$attributes[] = 'Max-Age='.$maxage;
}
if (!is_null($path)) {
$attributes[] = 'Path='.rawurlencode($path);
}
if (!is_null($domain)) {
$attributes[] = 'Domain='.rawurlencode($domain);
}
if ($secure) {
$attributes[] = 'Secure';
}
if ($httponly) {
$attributes[] = 'HttpOnly';
}
header('Set-Cookie: '.implode('; ', array_merge(array($cookie), $attributes)), false);
}