回答一个老问题,这篇新帖子发布于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没有正确的设置时,该函数会暂时修改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!'; }