您无法检测浏览器是否关闭。
我想到的最佳选择是检查 http 请求的引用值。
如果引用者为空,则用户直接打开您的网站(通过浏览器地址字段或使用保存的收藏链接等)
如果引用者与您自己的域不同,则用户来自其他站点,例如谷歌。
$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;
}
(所有这些代码都未经测试,所以它可能无法按原样工作,但我想你明白了)