ホームページ  >  記事  >  バックエンド開発  >  複数のドメイン名での SESSION の共有を実現します。

複数のドメイン名での SESSION の共有を実現します。

巴扎黑
巴扎黑オリジナル
2016-11-24 09:13:161740ブラウズ

マルチドメイン名共有セッションを実現するには、まず SESSION の動作メカニズムを理解する必要があります。基本的な概念については説明しません。
セッションは次のように動作します:
ユーザー A がサイト Y を訪問します。サイト Y が session_start(); を実行すると (以下では session_start() が常に存在すると仮定します)、このセッション ID は通常、次の形式で保存されます。 COOKIE のユーザー A (php.ini で session.use_only_cookies を 1 に設定することで、SESSION ID を強制的に COOKIE に渡すことができます)。このとき、SESSION ID は $_COOKIE['PHPSESSID'] として表示されます (PHPSESSID は session_name() 関数で変更できます)
ユーザー A がアクセスすると、このセッション ID ($_COOKIE['PHPSESSID']) が使用されます。 A が Y を訪問するたびに、サイト Y に送信されます。
サイト Y には、SESSION の実際のデータを保存するために使用されるディレクトリがあります。サイト Y はセッション ID を受信し、セッション ID を通じて SESSION データとの関連付けを取得し、SESSION データを返します。

賢いあなたはすでに考えているかもしれません。サーバーとクライアント間の SESSION は SESSION ID を介して接続され、SESSION データは通常のファイルの形式で特定のフォルダーに保存されます。
その後、異なるドメイン名を実装したい場合は、次の 2 つの条件を満たすだけで済みます:

1) 異なるドメイン名の SESSION データ ディレクトリを統合したり、同時に更新したりできる。

2) 同じ顧客の場合、統一された SESSION ID を使用します

最初の条件の実装。
同じサーバーの場合は特に設定は必要ありません。
クラスター化/分散化されているのであれば、私が何も言う必要はないと思います。 。分散アプリケーションを実行できる人は、私よりもディレクトリ共有の経験があるはずです。あまり多くのサーバーをテストしたわけではありませんが、主観的条件と客観的条件の両方に理由があります。

ここでは主に 2 番目の条件について話したいと思います。つまり、異なるドメイン名に統一された SESSION ID を持たせることです。
ではどうやって統一すればいいのでしょうか?
まず、この SESSION ID を異なるドメイン名間で渡す必要があります。また、Cookie はドメイン名に固有である必要があるため、転送アクションはクライアントによって完了します。配信プロセスがクライアントによって完了していない場合、配信されているドメイン名はどのクライアント向けであるかわかりません。

2 番目のステップは、転送を受け入れるドメイン名の SESSION ID を変更することです。

配信方法:
HTMLでは、多くのメソッドを使用できます。たとえば、
iframe

または .js

またはimg html要素

特定のアドレスを呼び出せれば問題ありません。

wmlでは、wmlスクリプトの特性上、スクリプト形式で呼び出すことができず、wmlにはiframeがありません。ただし、img経由で転送することは可能です。

変更方法:
SESSION ID は通常 COOKIE を介して渡されるため、$_COOKIE['PHPSESSID']; を渡すだけで済みます。ただし、PHPSESSID を session_name で変更すると、setcookie で PHPSESSID を変更する必要があり、非常に面倒になります。 。したがって、セッション固有の関数 session_id を選択して、$_COOKIE['PHPSESSID']; を変更できます。

注意すべき点がいくつかあります:

session.use_only_cookies が 0 (PHP のデフォルト) の場合、セッション ID は URL または Passing になります。他の形式では

session_id() と session_name は session_start() の前に使用する必要があります

以下は、複数のドメイン名を実装するために私が作成した単純なクラスです。上記のことが理解できない場合は、私のマルチドメイン名のクラスを見てください。このクラスは、HTML 上の iframe 形式で実装されます。

/*

使用:
サーバーA、サーバーB、Aのindex.phpにログインし、BにSESSIONを受信するファイル(ses_get.phpなど)を作成します
Aのindex.php
に次の変更を加えますsession_start();
の追加を開始し、どこにでも mdSession::_set('B/ses_get.php')
と書き込み、ses_get.php の先頭に mdSession を書き込みます:_get();
@Author:surfchen@gmail.com http://www.surfchen.org/ */
function mdSession()
{

} function set($urls)
{ if (!is_array( $urls))
{ $urls=array($urls); } foreach ($urls として $value)
{ echo ''; } return true; } function get()
{ session_id($_SERVER ['QUERY_STRING']) ; session_start(); } 関数 _set($urls){ $obj=new mdSession(); 戻り値 $obj->set($urls); } ); return $obj->get(); }
}?>


index.php :

include "mdSession.php";

session_start();

$_SESSION['php']="yogurt8";

mdSession::_set('http://www.b.com/ses_get.php');

var_dump($_SESSION );

?> ;

ses_get.php

include "mdSession.php";

mdSession::_get();

?>

b.php :

session_start();

var_dump(セッション);

まず http://www.a.com/a.php にアクセスしてから、http://www.b.com/b.php にアクセスして効果を確認してください

FirefoxとGoogle Chromeでは動作しますが、Ieではまだ動作しません


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。