2012-01-30 30 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

相关问题