Thật không may, Hết hạn là ngày tuyệt đối và phụ thuộc vào ngày địa phương của đại lý người dùng. Như bạn đã kết luận một cách chính xác, điều này có thể dẫn đến một cookie hết hạn không chính xác.
Đây cũng là lý do tại sao tiêu chuẩn đầu tiên IETF của Netscape’s original proposal, thay thế ngày hết hạn tuyệt đối của một ngày hết hạn tương đối, các Max-Age thuộc tính mà quy định thời gian trong vài giây đồng bằng từ quan điểm trong thời gian cookie đã được cấp. RFC 2965, RFC 2109 đã lỗi thời, cũng làm như vậy. Giống như RFC 6265, hiện là thông số kỹ thuật mới nhất cho cookie.
Cookie theo RFC 6265 cũng cho phép để xác định thời hạn sử dụng bởi cả một ngày tương đối sử dụng Max-Age và một ngày tuyệt đối sử dụng Expires, sau này chủ yếu là để tương thích ngược:
Nếu một cookie có cả thuộc tính Max-Age và Expires, thuộc tính Max-Age được ưu tiên và kiểm soát ngày hết hạn của cookie.
Vì vậy, bạn có thể viết chức năng của riêng bạn mà bắt chước hành vi này:
$maxage = 12345;
$expires = date(DATE_COOKIE, time()+$maxage);
header("Set-Cookie: $name=$value, Expires=$expires, Max-Age=$maxage, …");
Dưới đây là một chức năng ví dụ:
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);
}
Đó thực sự là một câu hỏi tuyệt vời. Bạn có thể tạo JavaScript để làm điều đó, điều đó chắc chắn. Nhưng tôi khá tích cực bạn không thể làm điều đó trong PHP một mình. –
@Truth có thể nếu bạn đặt múi giờ thành múi giờ của khách hàng? – Mike
Điều đó vẫn không đảm bảo rằng thời gian sẽ giống với thời gian của người dùng. Chỉ JavaScript mới có thể biết được (hoặc anh ta có thể truyền nó trong một biểu mẫu, nhưng không được tính vào nó nếu nó quan trọng). –