回答一个老问题,这个新帖子发布于 2013 年 4 月 4 日
为了完成@misza 的回答,这里有一个高级方法来检查 cookie 是否已启用而无需重新加载页面。@misza 的问题在于,当 php ini 设置session.use_cookies
不正确时,它并不总是有效。此外,该解决方案不会检查会话是否已启动。
我制作了这个功能并在不同情况下对其进行了多次测试,并且做得很好。
function suGetClientCookiesEnabled() // Test if browser has cookies enabled
{
// Avoid overhead, if already tested, return it
if( defined( 'SU_CLIENT_COOKIES_ENABLED' ))
{ return SU_CLIENT_COOKIES_ENABLED; }
$bIni = ini_get( 'session.use_cookies' );
ini_set( 'session.use_cookies', 1 );
$a = session_id();
$bWasStarted = ( is_string( $a ) && strlen( $a ));
if( !$bWasStarted )
{
@session_start();
$a = session_id();
}
// Make a copy of current session data
$aSesDat = (isset( $_SESSION ))?$_SESSION:array();
// Now we destroy the session and we lost the data but not the session id
// when cookies are enabled. We restore the data later.
@session_destroy();
// Restart it
@session_start();
// Restore copy
$_SESSION = $aSesDat;
// If no cookies are enabled, the session differs from first session start
$b = session_id();
if( !$bWasStarted )
{ // If not was started, write data to the session container to avoid data loss
@session_write_close();
}
// When no cookies are enabled, $a and $b are not the same
$b = ($a === $b);
define( 'SU_CLIENT_COOKIES_ENABLED', $b );
if( !$bIni )
{ @ini_set( 'session.use_cookies', 0 ); }
//echo $b?'1':'0';
return $b;
}
用法:
if( suGetClientCookiesEnabled())
{ echo 'Cookies are enabled!'; }
else { echo 'Cookies are NOT enabled!'; }
重要提示:
该功能在没有正确设置时临时修改PHP的ini设置,并在未启用时恢复它。这仅用于测试是否启用了 cookie。当您启动会话并且 php ini 设置 session.use_cookies 的值不正确时,它可能会出错。为确保会话正常工作,请在开始会话之前检查和/或设置它,例如:
if( suGetClientCookiesEnabled())
{
echo 'Cookies are enabled!';
ini_set( 'session.use_cookies', 1 );
echo 'Starting session';
@start_session();
}
else { echo 'Cookies are NOT enabled!'; }