PHP会话cookie在浏览器关闭时过期


PHP session cookies to expire when browser closes

我在Wordpress中工作,并在我的functions.php页面中有以下内容。

我有一个3种不同风格的数组。我的cookie正在进行随机化。

if (isset($_COOKIE['style'])){
    $style = $_COOKIE['style'];
}
else {
    $style = ($rand[$stylearray]);
    setcookie('style',$style,time(),COOKIEPATH,COOKIE_DOMAIN,false); 
}

我想设置它,使我的cookie ONLY过期时浏览器关闭。然而,似乎在页面刷新(F5) cookie过期。

是否有一种方法可以设置它,使我的cookie只在浏览器关闭时过期?

http://www.w3schools.com/php/func_http_setcookie.asp显示

可选的。指定cookie的过期时间。取值:time()+86400*30,将cookie设置为30天后过期。如果省略该参数或将其设置为0,则cookie将在会话结束时(浏览器关闭时)过期。默认为0

setcookie('style',$style, 0 , ...); 

setcookie('style',$style, '', ...); 

必须工作。

您需要使用session。Cookie的问题是你需要修改php。ini,根据你的主机配置,你需要创建一个php.ini/php5.ini/.user.ini,并输入以下内容:

 session.cookie_lifetime = 0 

0 =表示直到浏览器关闭

无法检测浏览器是否已关闭。

我想到的最好的选择是检查http请求的引用值。

如果referer为空,则用户直接打开您的网站(通过浏览器地址字段或使用保存的收藏夹链接等)如果referer与你自己的域名不同,那么用户是通过其他网站来的,例如google.

$recreate_cookie = false;
$my_domain = '://example.com';
$referer = $_SERVER['HTTP_REFERER'];
if ( ! $referer ) { 
  // Website opened directly/via favorites
  $recreate_cookie = true; 
}
if ( false === strpos( $referer, $my_domain ) ) { 
  // User arrived from a link of some other website
  $recreate_cookie = true; 
}
if ( $recreate_cookie ) {
  // Only name and value are required in your case.
  setcookie( 'style', $style );
}

但请注意,这种方法也不是100%可靠,因为http引用可以被用户操纵或禁用(例如一些浏览器插件或可能在使用浏览器隐身模式时)


除了难以检测浏览器是否关闭之外,我建议使用PHP会话。

会话的优点是你可以存储尽可能多的数据,而不会减慢网站的速度。当你打开你的网站,你所有的cookie被发送到服务器。因此,如果您在cookie中存储了大量数据,那么加载的每个页面都会来回传输大量数据。另一方面,会话将只向服务器传输ID值。服务器将与该ID连接的所有数据存储在服务器上,从而节省了大量的传输量。
if ( ! session_id() ) { session_start(); }
// do the referer check here
if ( $recreate_cookie ) { 
  $_SESSION['style'] = $style; 
}  

也许添加一个计时器会在15分钟内不刷新样式,这样当用户关闭浏览器并在15分钟内再次打开页面时,他将拥有与以前相同的样式。

// do the session start and referer check here
if ( $recreate_cookie ) {
  $expires = intval( $_SESSION['style_expire'] );
  if ( $expires > time() ) { $recreate_cookie = false; }
}
if ( $recreate_cookie ) { 
  $_SESSION['style'] = $style; 
  // Style will not change in the next 15 minutes
  $_SESSION['style_expire'] = time() + 15 * 60; 
}  

(所有这些代码都是未经测试的,所以它可能不能按原样工作,但我想你已经明白了)