К сожалению, Срок действия является абсолютной датой и зависит от локальной даты агента пользователя.Как вы правильно сделали, это может привести к неточному истечению срока действия cookie.
Это также причина, по которой первая стандартизация IETF исходного предложения Netscape заменила абсолютную дату истечения относительным сроком действия.date, атрибут Max-Age , который указывает время в дельта-секундах с момента, когда был выпущен файл cookie. RFC 2965 , который устарел RFC 2109, сделал то же самое.Как и RFC 6265 , это самая последняя спецификация для файлов cookie.
Файлы cookie в соответствии с RFC 6265 также позволяют указывать дату истечения срока как для относительной даты, используя Макс.-Age и абсолютная дата с использованием Expires , последний в основном для обратной совместимости:
Если файл cookie имеет атрибуты Max-Age и Expires, то Max-Age атрибут имеет приоритет и управляет датой истечения срока действия куки.
Таким образом, вы можете написать свою собственную функцию, которая имитирует это поведение:
$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);
}