PHP のセッションを memcache に書き換え、クロストップレベルのドメイン名制限を満たす (シングルトン モードを適用する)

WBOY
リリース: 2016-06-13 12:52:36
オリジナル
826 人が閲覧しました

PHP のセッションを memcache に書き換え、クロストップレベル ドメイン名制限を実装する (アプリケーション シングルトン モード)

過去 2 日間、私は PHP クロストップレベル ドメイン名の問題を研究してきました。私は最終的に、しぶしぶ決定を下しました (しぶしぶだったと言うのは、$_COOKIE["mzlid"] の value メソッドは完璧な解決策ではありません。

が生成されたからです。

まず、アイデアについて話させてください:
クロストップレベルドメイン名を実現するには、プログラムが各ユーザーを識別できるようにするためのセッションの問題を解決する必要があります。

単一のドメイン名の場合、sessionid の値を生成する原則は、クライアントの IP およびその他の値、時間値、乱数に基づいて、特定の条件を使用して実装されます。最終的に生成され、Cookie に保存されます。ページがリクエストされるたびに、この値がヘッダーに取り込まれ、サーバー上の PHP ページがさまざまなユーザーを識別できるようになります。


クロスドメインの場合、複数のトップレベルドメイン名にアクセスするときにこの ID 値によって生成される値は同じでなければなりません。

ここで行うことは、顧客の IP および顧客のその他の環境値に基づいて値を生成し、それを Cookie に保存することです。その後、ゲストが Web サイト A にアクセスすると、この値が生成されます。次回、B Web サイトを初めて使用するとき、この値は存在しません。存在しない場合は、以前の生成ルールに従って再度生成されます。

その後、2 つの Web サイトが $_COOKIE["mzlid"] の値を読み取ると、同じ顧客は同じ値を取得します。

次に、この値に基づいてキー名が付けられ、内容が json データの形式で保存されます。

今後、このゲストのセッションの値を追加、変更、または削除したい場合は、memcache に移動して、キー名として $_COOKIE["mzlid"] を使用して値を確認し、それを json 形式で出力します。それで大丈夫です。

複数のサーバーにまたがる機能は、memcache のクラスター機能を使用することで実現されます。


以下はPHPがmemcacheを操作するためのセッションクラスです。

$_COOKIE["mzlid"] の生成を省略するだけです。



<?php

/**
 * 自定义的session方式,功能是把需要写成session的值存入memcache里,应用单例模式
 *  by jroam   http://www.10np.com
 *  
 *  用法:
 *  $mss=MySession:init();
	$mss->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);
    }


}






?>
ログイン後にコピー


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート