PHP のセッションを memcache に書き換え、クロストップレベル ドメイン名制限を実装する (アプリケーション シングルトン モード)
過去 2 日間、私は PHP クロストップレベル ドメイン名の問題を研究してきました。私は最終的に、しぶしぶ決定を下しました (しぶしぶだったと言うのは、$_COOKIE["mzlid"] の value メソッドは完璧な解決策ではありません。
が生成されたからです。まず、アイデアについて話させてください:
クロストップレベルドメイン名を実現するには、プログラムが各ユーザーを識別できるようにするためのセッションの問題を解決する必要があります。
ここで行うことは、顧客の IP および顧客のその他の環境値に基づいて値を生成し、それを Cookie に保存することです。その後、ゲストが Web サイト A にアクセスすると、この値が生成されます。次回、B Web サイトを初めて使用するとき、この値は存在しません。存在しない場合は、以前の生成ルールに従って再度生成されます。
その後、2 つの Web サイトが $_COOKIE["mzlid"] の値を読み取ると、同じ顧客は同じ値を取得します。
次に、この値に基づいてキー名が付けられ、内容が json データの形式で保存されます。
今後、このゲストのセッションの値を追加、変更、または削除したい場合は、memcache に移動して、キー名として $_COOKIE["mzlid"] を使用して値を確認し、それを json 形式で出力します。それで大丈夫です。
複数のサーバーにまたがる機能は、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); } } ?>