我在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;
}
(所有这些代码都是未经测试的,所以它可能不能按原样工作,但我想你已经明白了)