2012-01-30 25 views
13

tôi có những yêu cầu sau:Chúng tôi có thể đặt cookie trong php theo thời gian của khách hàng không?

  1. tạo một cookie cho máy chủ miền
  2. rằng cookie sẽ hết hạn trong x giây nói ở 200 hoặc 500 giây.

Vấn đề là khách hàng có thể tụt hậu nhiều phút sau máy chủ. Ở phía máy chủ, tôi đang đặt cookie là

setcookie($cooName,$cooVal,time()+500,"/"); 

nhưng bây giờ nếu máy tính của khách hàng 500 giây phía sau máy chủ, mã trên sẽ có hiệu lực trong 1000 giây không phải 500 giây.

Tôi đã nghĩ gửi tem thời gian của khách hàng đến máy chủ và đặt cookie vào thời điểm đó. một cái gì đó như thế này:

setcookie($cooName,$cooVal,$_GET['clientTS']+500,"/"); 

Nhưng nếu khách hàng là 500 giây đằng sau, và nếu tôi đặt như một cookie được lùi ngày nó không được thiết lập. Làm thế nào để đạt được một đồng bộ thời gian giữa khách hàng và máy chủ trong trường hợp hết hạn cookie?

+0

Đó 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. –

+1

@Truth có thể nếu bạn đặt múi giờ thành múi giờ của khách hàng? – Mike

+1

Đ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). –

Trả lời

10

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); 
} 
+0

Đúng - thuộc tính 'Max-Age' là cách chính xác để đạt được điều này. – WildlyInaccurate

+0

Nếu bạn viết chức năng cookie của riêng bạn, không để có được 'rawurlencode' tên và giá trị. – mcrumley

+0

cảm ơn, tôi sẽ cố gắng đề xuất của bạn sớm. – Shades88

Các vấn đề liên quan