回答一个老问题,这篇新文章发布于2013年4月4日
为了完成@misza的答案,这里提供了一种高级方法,用于检查是否启用了cookie而无需重新加载页面。@misza的问题是,当php ini设置session.use_cookies
不正确时,它并不总是起作用。此外,该解决方案不会检查会话是否已经启动。
我进行了此功能并在不同情况下对其进行了多次测试,并且效果很好。
function suGetClientCookiesEnabled() // Test if browser has cookies enabled
{
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();
}
$aSesDat = (isset( $_SESSION ))?$_SESSION:array();
@session_destroy();
@session_start();
$_SESSION = $aSesDat;
$b = session_id();
if( !$bWasStarted )
{
@session_write_close();
}
$b = ($a === $b);
define( 'SU_CLIENT_COOKIES_ENABLED', $b );
if( !$bIni )
{ @ini_set( 'session.use_cookies', 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!'; }