Home > Article > Backend Development > PHP网站中保持登录状态的功能是怎么做的?
大多数网站在用户登录时会提供一个“记住我”或者“保持登录状态”的选项,我只知道是用Cookie实现的,但是具体来说的工作流程是什么?因为要实现一个网站登录的东西,所以想从细节方面了解这个问题。
<code class="language-php"><span class="x">//验证用户名和密码成功后</span>
<span class="x">$_SESSION['userinfo'] = [</span>
<span class="x"> 'uid' => 123,</span>
<span class="x"> 'username' => 'testuser'</span>
<span class="x">];</span>
</code>
PHP中有cookie相关的函数, 用户登录成功的时候,可能有如下的语句:<code class="language-php"><span class="x">function set_cookie($data,$path = '/',$time = 0,$doma = NULL)</span>
<span class="x">{</span>
<span class="x"> if(!is_array($data))</span>
<span class="x"> {</span>
<span class="x"> $para = func_get_args();</span>
<span class="x"> $data = array($para[0] => $para[1]);</span>
<span class="x"> $path = isset($para[2]) ? $para[2] : '/';</span>
<span class="x"> $time = isset($para[3]) ? $para[3] : 0;</span>
<span class="x"> $doma = isset($para[4]) ? $para[4] : NULL;</span>
<span class="x"> }</span>
<span class="x"> if(is_int($path))</span>
<span class="x"> {</span>
<span class="x"> $time = $path;</span>
<span class="x"> $path = '/';</span>
<span class="x"> }</span>
<span class="x"> if(is_string($time))</span>
<span class="x"> {</span>
<span class="x"> $doma = $time;</span>
<span class="x"> $time = 0;</span>
<span class="x"> }</span>
<span class="x"> $time = $time == 0 ? $time : time()+$time;</span>
<span class="x"> foreach($data as $key => $value)</span>
<span class="x"> {</span>
<span class="x"> if(!is_array($value))</span>
<span class="x"> {</span>
<span class="x"> if(strpos($key,'.') === FALSE)</span>
<span class="x"> {</span>
<span class="x"> if(isset($_COOKIE[$key]))</span>
<span class="x"> {</span>
<span class="x"> if(is_array($_COOKIE[$key]))</span>
<span class="x"> {</span>
<span class="x"> $cookie_str = http_build_query(array($key => $_COOKIE[$key]));</span>
<span class="x"> $cookie_arr = explode('&',$cookie_str);</span>
<span class="x"> foreach($cookie_arr as $cookie)</span>
<span class="x"> {</span>
<span class="x"> $a_cookie = explode('=',$cookie);</span>
<span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> $_COOKIE[$key] = NULL;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> setcookie($key,$value,$time,$path,$doma);</span>
<span class="x"> $_COOKIE[$key] = $value;</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cop = &$_COOKIE;</span>
<span class="x"> $cox = substr_count($key,'.');</span>
<span class="x"> foreach(explode('.',$key) as $ckk => $ckey)</span>
<span class="x"> {</span>
<span class="x"> if($ckk > 0)</span>
<span class="x"> {</span>
<span class="x"> $cookie_key .= '['.$ckey.']';</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cookie_key = $ckey;</span>
<span class="x"> }</span>
<span class="x"> if($ckk
<span class="x"> {</span>
<span class="x"> if(isset($cop[$ckey]))</span>
<span class="x"> {</span>
<span class="x"> if(!is_array($cop[$ckey]))</span>
<span class="x"> {</span>
<span class="x"> setcookie($cookie_key,NULL,-1,$path,$doma);</span>
<span class="x"> $cop[$ckey] = NULL;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cop[$ckey] = NULL;</span>
<span class="x"> }</span>
<span class="x"> $cop = &$cop[$ckey];</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> if(isset($cop[$ckey]))</span>
<span class="x"> {</span>
<span class="x"> if(is_array($cop[$ckey]))</span>
<span class="x"> {</span>
<span class="x"> $cookie_str = http_build_query(array($cookie_key => $cop[$ckey]));</span>
<span class="x"> $cookie_arr = explode('&',$cookie_str);</span>
<span class="x"> foreach($cookie_arr as $cookie)</span>
<span class="x"> {</span>
<span class="x"> $a_cookie = explode('=',$cookie);</span>
<span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> $cop[$ckey] = NULL;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cop[$ckey] = NULL;</span>
<span class="x"> }</span>
<span class="x"> $cop = &$cop[$ckey];</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> setcookie($cookie_key,$value,$time,$path,$doma);</span>
<span class="x"> $cop = $value;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $x_cookie_str = http_build_query($value);</span>
<span class="x"> $x_cookie_arr = explode('&',$x_cookie_str);</span>
<span class="x"> foreach($x_cookie_arr as $x_cookie)</span>
<span class="x"> {</span>
<span class="x"> $a_cookie = explode('=',$x_cookie);</span>
<span class="x"> if(isset($a_cookie[1]))</span>
<span class="x"> {</span>
<span class="x"> set_cookie($key.'.'.str_replace(array('[',']'),array('.',''),urldecode($a_cookie[0])),urldecode($a_cookie[1]),$time,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x">}</span>
<span class="x">function cookie($key = NULL,$def = FALSE)</span>
<span class="x">{</span>
<span class="x"> if(!empty($key))</span>
<span class="x"> {</span>
<span class="x"> if(strpos($key,'.') === FALSE)</span>
<span class="x"> {</span>
<span class="x"> if(isset($_COOKIE[$key]))</span>
<span class="x"> {</span>
<span class="x"> return $_COOKIE[$key];</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> return $def;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cop = &$_COOKIE;</span>
<span class="x"> foreach(explode('.',$key) as $ckey)</span>
<span class="x"> {</span>
<span class="x"> if(isset($cop[$ckey]))</span>
<span class="x"> {</span>
<span class="x"> $cop = &$cop[$ckey];</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> return $def;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> return $cop;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> return $_COOKIE;</span>
<span class="x"> }</span>
<span class="x">}</span>
<span class="x">function unset_cookie($key = NULL,$path = '/',$doma = NULL)</span>
<span class="x">{</span>
<span class="x"> if(!empty($key))</span>
<span class="x"> {</span>
<span class="x"> if(strpos($key,'.') === FALSE)</span>
<span class="x"> {</span>
<span class="x"> if(isset($_COOKIE[$key]))</span>
<span class="x"> {</span>
<span class="x"> if(!is_array($_COOKIE[$key]))</span>
<span class="x"> {</span>
<span class="x"> setcookie($key,NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cookie_str = http_build_query(array($key => $_COOKIE[$key]));</span>
<span class="x"> $cookie_arr = explode('&',$cookie_str);</span>
<span class="x"> foreach($cookie_arr as $cookie)</span>
<span class="x"> {</span>
<span class="x"> $a_cookie = explode('=',$cookie);</span>
<span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> unset($_COOKIE[$key]);</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cop = &$_COOKIE;</span>
<span class="x"> $ckeys = explode('.',$key);</span>
<span class="x"> $pop_ckey = array_pop($ckeys);</span>
<span class="x"> foreach($ckeys as $ckk => $ckey)</span>
<span class="x"> {</span>
<span class="x"> if($ckk > 0)</span>
<span class="x"> {</span>
<span class="x"> $cookie_key .= '['.$ckey.']';</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cookie_key = $ckey;</span>
<span class="x"> }</span>
<span class="x"> if(isset($cop[$ckey]))</span>
<span class="x"> {</span>
<span class="x"> $cop = &$cop[$ckey];</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> return;</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> if(isset($cop[$pop_ckey]))</span>
<span class="x"> {</span>
<span class="x"> if(!is_array($cop[$pop_ckey]))</span>
<span class="x"> {</span>
<span class="x"> setcookie($cookie_key.'['.$pop_ckey.']',NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> $cookie_str = http_build_query(array($cookie_key.'['.$pop_ckey.']' => $cop[$pop_ckey]));</span>
<span class="x"> $cookie_arr = explode('&',$cookie_str);</span>
<span class="x"> foreach($cookie_arr as $cookie)</span>
<span class="x"> {</span>
<span class="x"> $a_cookie = explode('=',$cookie);</span>
<span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> unset($cop[$pop_ckey]);</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x"> else</span>
<span class="x"> {</span>
<span class="x"> if(!empty($_COOKIE))</span>
<span class="x"> {</span>
<span class="x"> $cookie_str = http_build_query($_COOKIE);</span>
<span class="x"> $cookie_arr = explode('&',$cookie_str);</span>
<span class="x"> foreach($cookie_arr as $cookie)</span>
<span class="x"> {</span>
<span class="x"> $a_cookie = explode('=',$cookie);</span>
<span class="x"> setcookie(urldecode($a_cookie[0]),NULL,-1,$path,$doma);</span>
<span class="x"> }</span>
<span class="x"> $_COOKIE = array();</span>
<span class="x"> }</span>
<span class="x"> }</span>
<span class="x">}</span>
</span></code>
虽然cookie和session都可以实现题主所想要的功能,但是更推荐使用session。<code class="language-php"><span class="x">// 登录成功后记录登录信息</span>
<span class="x">$_SESSION['loginStatus'] = array(</span>
<span class="x"> 'username' => $username,</span>
<span class="x"> 'status' => true,</span>
<span class="x"> 'loginTime' = > time(),</span>
<span class="x">);</span>
<span class="x">.</span>
<span class="x">.</span>
<span class="x">.</span>
<span class="x">// 判断session信息</span>
<span class="x">if(empty($_SESSION['loginStatus']['status']) || !$_SESSION['loginStatus']['status']) {</span>
<span class="x"> // 引导到登录页</span>
<span class="x">} else {</span>
<span class="x"> // 加载用户信息</span>
<span class="x">}</span>
</code>
cookie和session
我记得韩顺平老师的视频里面,有一块专门教写登录模块的教程。