2012-01-30 29 views
13

我有以下要求:我們可以根據客戶的時間在php中設置cookie嗎?

  1. 創建服務器域
  2. 該cookie將在x秒過期餅乾說,在200或500秒。

問題是,客戶端可能會滯後多達幾分鐘的時間。在服務器端我設置cookie裏

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

但現在如果客戶端計算機位於服務器500秒,上面的代碼會影響到一個cookie,這將在千秒不500秒到期。

我正在考慮發送客戶端的時間戳到服務器,並在那個時候設置cookie。是這樣的:

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

但如果客戶是500秒落後,如果我設定它追溯它不會設置一個cookie。如何在cookie過期的情況下實現客戶端和服務器之間的時間同步?

+0

這實際上是一個非常好的問題。你可以生成JavaScript來做到這一點,這是肯定的。但是我非常積極,你不能單獨使用PHP。 – 2012-01-30 11:21:26

+1

@Truth也許如果您將時區設置爲客戶端時區? – Mike 2012-01-30 11:25:47

+1

這仍然不能保證時間將與用戶的時間相同。只有JavaScript可以知道(或者他可以將它傳遞給一個表單,但如果它非常重要,則不要指望它)。 – 2012-01-30 11:26:41

回答

10

不幸的是,到期是絕對日期並取決於用戶代理的本地日期。正如你已經正確地得出結論,這可能導致cookie失效不準確。

這也是IETF的的Netscape’s original proposal第一標準化,通過相對到期日取代了絕對到期日期的原因,最大年齡所指定的增量秒的時間從時間餅乾一直點屬性發行。 RFC 2965,即過時的RFC 2109,也一樣。就像RFC 6265一樣,這是目前最新的cookies規範。

曲奇餅按照RFC 6265做也允許指定通過使用最大年齡一個絕對日期使用到期,二者的相對日期和到期日期後者主要用於後向兼容:

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

正確 - 「Max-Age」屬性是實現此目的的正確方法。 – WildlyInaccurate 2012-01-30 12:15:37

+0

如果你編寫自己的cookie函數,不要去獲取'rawurlencode'的名字和值。 – mcrumley 2012-01-30 12:34:05

+0

謝謝,我會很快嘗試你的建議。 – Shades88 2012-01-30 15:59:47

相關問題