溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何在php中利用cookie對(duì)隊(duì)列進(jìn)行操作

發(fā)布時(shí)間:2020-12-17 15:23:39 來源:億速云 閱讀:153 作者:Leah 欄目:開發(fā)技術(shù)

如何在php中利用cookie對(duì)隊(duì)列進(jìn)行操作?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。

一、PHP 的COOKIE

cookie 是一種在遠(yuǎn)程瀏覽器端儲(chǔ)存數(shù)據(jù)并以此來跟蹤和識(shí)別用戶的機(jī)制。

PHP 在http 協(xié)議的頭信息里發(fā)送cookie,因此 setcookie() 函數(shù)必須在其它信息被輸出到瀏覽器前調(diào)用,這和對(duì)  header() 函數(shù)的限制類似.

設(shè)置cookie:

可以用 setcookie()或 setrawcookie()函數(shù)來設(shè)置 cookie,也可以通過向客戶端直接發(fā)送http  頭來設(shè)置.

這里使用 setcookie()函數(shù)設(shè)置cookie:

bool setcookie ( string name [, string value [,int expire [,string path [,string domain [,bool secure [,bool httponly]]]]]] )

其中的參數(shù):

name: cookie 變量名

value: cookie 變量的值

expire: 有效期結(jié)束的時(shí)間

path: 有效目錄

domain: 有效域名,頂級(jí)域唯一

secure: 如果值為 1,則cookie 只能在https 連接上有效,如果為默認(rèn)值 0,則http 和 https 都可以.

我們需要用到隊(duì)列,代碼如下:

class QueueSvc 
{/*{{{*/ 
    private $length; // 隊(duì)列的長度 
    private $server_arr; 
     
    public function __construct($length,$server_arr) 
    { 
        $this->length = $length; 
        $this->server_arr = $server_arr; 
    } 
     
    public function getServerArr() 
    { 
        return $this->server_arr; 
    } 
     
    public function set($server_name) 
    { 
        self::push($server_name); 
    } 
     
    private function push($server_name) 
    { 
        //有重復(fù)的記錄,把重復(fù)的刪掉 
        if(self::isServerExist($server_name)){ 
            self::removeRepeat($server_name); 
        }else{ 
            if(self::isFull()){ 
                //如果已經(jīng)滿了,要把隊(duì)列最后一個(gè)記錄刪掉 
                array_pop($this->server_arr); 
            } 
        } 
        //如果隊(duì)列為空,先置為空數(shù)組 
        if(emptyempty($this->server_arr)) 
            $this->server_arr = array(); 
        //向隊(duì)列頭添加數(shù)據(jù)  
        array_unshift($this->server_arr,$server_name);   
    } 
     
    private function isFull() 
    { 
        if(is_array($this->server_arr) && (count($this->server_arr) >= $this->length)) 
            return true; 
        return false;  
    } 
     
    private function isServerExist($server_name) 
    { 
        if(is_array($this->server_arr) && in_array($server_name,$this->server_arr)) 
            return true; 
        return false; 
    } 
     
    private function removeRepeat($server_name) 
    { 
        if(is_array($this->server_arr) && in_array($server_name,$this->server_arr)) 
        { 
            foreach($this->server_arr as $key=>$value) 
            { 
                if($server_name == $value) 
                { 
                    $this->array_remove($this->server_arr,$key); 
                } 
            }    
        } 
    } 
     
    private function array_remove(&$arr, $offset) {      
        array_splice ( $arr, $offset, 1 );  
    } 
}/*}}}*/require_once('queue_svc.php'); 
class CookieSvc 
{/*{{{*/ 
    const   COOKIE_KEY = "GAME_SERVER"; 
     
    const   SEPARATE   = "|"; 
 
    const   COOKIE_LENGTH = "2"; 
     
    public function getCookieArr() 
    {/*{{{*/ 
        $server_str =  $_COOKIE[self::COOKIE_KEY]; 
        $server_str =  $_COOKIE['GAME_SERVER']; 
        if($server_str == ''){ 
            $result =  array(); 
        }else{ 
            $result = explode(self::SEPARATE,$server_str); 
        } 
        return $result; 
    }/*}}}*/ 
     
    public function set($cookie_id) 
    {/*{{{*/ 
        $server_arr = self::getCookieArr(); 
        if($cookie_id != false) 
        {
            $que = new QueueSvc(self::COOKIE_LENGTH,$server_arr); 
            $que->set($cookie_id); 
            $server_new = $que->getServerArr(); 
            if(is_array($server_new)) 
            { 
                $cookie_str = implode(self::SEPARATE,$server_new); 
                setcookie(self::COOKIE_KEY,$cookie_str,time()+3600,'/'); 
            } 
        } 
    }/*}}}*/ 
}/*}}}*/


不多解釋了,這個(gè)別人用的不多,昨天因?yàn)樾枰獙懙?留一下吧,也許以后還用得到,調(diào)用的代碼很簡單,代碼如下:

require_once("queue_svc.php"); 
require_once("cookie_svc.php"); 
$cookie_id = '4'; 
CookieSvc::set($cookie_id);


這樣就可以了,大家可以每次把$cookie_id換做不同的值,來檢驗(yàn)此操作,檢驗(yàn)的代碼可以用如下代碼:

var_dump($_COOKIE);

二、常見問題解決:

1. 用 setcookie()時(shí)有錯(cuò)誤提示,可能是因?yàn)檎{(diào)用setcookie()前面有輸出或空格。也可能你的文檔是從其他字符集轉(zhuǎn)換過來,文檔后面可能帶有 BOM 簽名(就是在文件內(nèi)容添加一些隱藏的BOM 字符),解決的辦法就是使你的文檔不出現(xiàn)這種情況,還有通過使用ob_start()函數(shù)也能處理一點(diǎn).

2. $_COOKIE 受magic_quotes_gpc 影響,可能自動(dòng)轉(zhuǎn)義.

3. 使用的時(shí)候,有必要測試用戶是否支持cookie.

看完上述內(nèi)容,你們掌握如何在php中利用cookie對(duì)隊(duì)列進(jìn)行操作的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI