php裡改寫session到memcache裡,並兌現跨頂級網域名稱的限制(應用單例模式)

來源:互聯網
上載者:User
php裡改寫session到memcache裡,並實現跨頂級網域名稱的限制(應用單例模式)

這兩天研究php跨頂級網域名稱問題:終於做了一個勉強(說是勉強,是因為產生$_COOKIE["mzlid"]的值的方法不是完美的)的方案.

首先說一下思路:
session要實現跨頂級網域名稱問題,得解決,程式能識別每一位使用者,

在單個網域名稱的時候,是通過sessionid來實現的,sessionid的值的產生原理,是根據用戶端的IP,還有其它值,加上時間值,加上隨機數,再通過一定規則,最後產生出來並儲存在cookie裡的。每次請求頁面,都把這個值帶入header裡,這樣伺服器上的php頁面就能識別出不同的使用者了。


要跨域,那麼這個Id值在訪問幾個頂級網域名稱產生的值要保持一樣。

在這裡我的作法是:根據客戶的IP,客戶的一些其它環境值,產生一個值,並把它存入一個cookie裡,那麼當客人訪問A網站的時間,這個值,產生了,接下來第一次B網站時,這個值沒有,如果沒有就根據前面的建置規則再產生一次。

那麼兩個網站在讀取$_COOKIE["mzlid"]這個值時,同一個客戶,得到的值就是一樣的。

接下來我們把它存到memcache裡,鍵名就以這個值為名,內容,以json化資料的形式存進去。

以後這個客人的session的值要增加,修改,刪除,都去memcache裡查以$_COOKIE["mzlid"]為鍵名的值,再把它json出來。就OK了。

跨多伺服器特點就是利用memcache的叢集功能實現.

下面是php操作memcache的session類。

只是省略了$_COOKIE["mzlid"]的產生。


set("host","http://www.10np.com");$mss->close(); */class MySession{public $memcache;public $seid;private static $instance;//存放執行個體化對像,private function __construct() {global $SYS_config;$this->memcache = memcache_connect($SYS_config["memcachedIP"], $SYS_config["memcacheddk"]); }//初始化function init(){if (!isset(self::$instance)) {            $c = __CLASS__;            self::$instance = new $c;        }        return self::$instance;}/** * k值 sessionk值 * $v  內容值 */function set($k,$v){$this->seid=($_COOKIE["mzlid"]);if($this->seid=="")return "無";//擷取已經存在的值$a=memcache_get($this->memcache,$this->seid);if($a) $arr=json_decode($a,true);$arr[$k]=$v;$a=json_encode($arr);$f=memcache_set($this->memcache,$this->seid,$a,MEMCACHE_COMPRESSED,36000);}/** * k值 sessionk值 * $v  內容值 */function get($k,$v){$this->seid=($_COOKIE["mzlid"]);if($this->seid=="") return "元";$a=memcache_get($this->memcache,$this->seid);$arr=json_decode($a,true);return ($arr[$k])?$arr[$k]:"";}/** * 刪除一個值 * 如果$k值為空白時,刪除這個使用者所有的session值 */function del($k){$this->seid=($_COOKIE["mzlid"]);if($this->seid=="") return "";if($k==""){memcache_delete($this->memcache,$this->seid);return;}$a=memcache_get($this->memcache,$this->seid);$arr=json_decode($a,true);unset($arr[$k]);memcache_set($this->memcache,$this->seid,json_encode($arr),MEMCACHE_COMPRESSED,36000);}/** * 關閉memcache的串連 */function close(){memcache_close($this->memcache);}// 阻止使用者複製對象執行個體public function __clone()    {        trigger_error('請不要複製對像.', E_USER_ERROR);    }}?>


  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.