ホームページ  >  記事  >  php教程  >  PHP でサブドメイン間でセッションを実装する 3 つの方法

PHP でサブドメイン間でセッションを実装する 3 つの方法

高洛峰
高洛峰オリジナル
2016-12-24 09:09:201183ブラウズ

以前に何かを作成していたときは、サブドメイン間の問題だけでなく、ドメイン間の問題も解決できるように、セッションは通常データベースに直接保存されていました。しかし、今日遭遇した問題は、セッションを変更する必要があるということでした。他人の既存のもの。それは単なるサブドメインだったので、簡単な解決策があるに違いないと考え、Du Niang は 3 つの解決策を見つけました:

セッションは主に 2 つの部分に分かれています:

1 つはセッション データで、デフォルトでサーバーに保存されます。 、ファイルの形式で存在します。

もう 1 つは、セッション データをマークするセッション ID です。セッション ID は、セッション ファイルのファイル名であり、ランダムに生成されるため、一意性とランダム性が保証され、セッションのセキュリティが確保されます。通常、セッションの有効期間が設定されていない場合、セッション ID はブラウザを閉じた後、自動的にログアウトされ、新しいセッション ID が登録されます。クライアントが Cookie を無効にしない場合、Cookie はセッション セッションの開始時にセッション ID とセッションの有効期間を保存する役割を果たします。

2 つの異なるドメイン名の Web サイトが同じセッションを使用したいと考えていますが、これにはセッションのクロスドメインの問題が伴います。

デフォルトでは、各サーバーは同じクライアントの SESSIONID を生成します。たとえば、同じユーザーのブラウザーの場合、サーバー A によって生成される SESSION ID は 11111111111 ですが、サーバー B によって生成される SESSION ID は 222222 です。また、PHP の SESSION データは、このサーバーのファイル システムに別途保存されます。 SESSION データを共有したい場合は、2 つの目標を達成する必要があります:

1 つは、同じクライアントに対して各サーバーによって生成された SESSION ID が同じである必要があり、同じ COOKIE を通過できることです。つまり、各サーバーは、読み取り可能であること PHPSESSID という名前の同じ COOKIE を使用します

もう 1 つは、SESSION データの保存方法と場所が各サーバーにアクセスできることを保証する必要があることです。簡単に言うと、これら 2 つの目標は、複数のサーバー (A サーバーと B サーバー) がクライアントの SESSION ID を共有し、サーバーの SESSION データも共有する必要があるということです。

解決策は 3 つあります:

1. PHP ページの最初 (出力の前、session_start() の前) で次の設定を行います。

ini_set('session.cookie_path', '/');
ini_set('session.cookie_domain', '.mydomain.com');
ini_set('session.cookie_lifetime', '1800');

2. .ini 内の

3. PHP ページの先頭で関数

session.cookie_path = /
session.cookie_domain = .mydomain.com
session.cookie_lifetime = 1800

を呼び出します (1 と同じ条件)

session は、セッションの唯一の識別子として Session_id を持ちます。

セッション サブドメインを実装するには、実際、同じブラウザーで 2 つの A サブドメインと B サブドメインにアクセスすると、それらのセッションは同じになります。


セッションはサーバー側に保存されるため、2 つのサーバーはこれら 2 つのリクエストが 1 つのブラウザーによって発行されたことをどのように識別できるでしょうか?


Cookie はクライアントに保存されます。通常、サーバーは Cookie を通じてさまざまなクライアントを識別します。そのため、Cookie を使用して Session_id を保存し、Cookie を親ドメインとして設定できます。


たとえば、a.sso.com にアクセスすると、session_id が Cookie に保存されます。 b.sso.com にアクセスすると、cookie から session_id が取得され、session_id を介して永続コンテナからセッションが取得されます。


たとえば、a.sso.com にアクセスすると、session_id が Cookie に保存されます。 b.sso.com にアクセスすると、cookie から session_id が取得され、session_id を介して永続コンテナからセッションが取得されます。


この実験では、実験言語として PHP を使用します。


a.sso.com にアクセスすると、 session_id は

session_set_cookie_params(1800 , '/', '.mydomain.com');


を通じて Cookie に保存されます。


PHPではセッションは配列であるため、PHPには配列

session_start();
 $_SESSION['person'] = "SBSBSBS";
 $session_id = session_id();
 setcookie('name',$session_id,time()+3600*24,'/','SSO.com');

をシリアル化し、$session_valueをデータベースに保存するserialize()関数があります。


b.sso.com にアクセスすると、Cookie から session_id が取得され、session_id に従ってデータベースからシリアル化されたセッションが取得されます。

その後、セッションを操作してセッションのクロスサブドメインを実現できます。

セッションをデータベースに保存すると、それにアクセスするのは比較的時間がかかる操作になるため、セッションを memcached や redis などのキャッシュに保存できます。


この方法では、セッションへのアクセスが高速になります。 。


キャッシュを使用するもう 1 つの利点は、通常、セッションに一定の生存時間が存在する場合、セッションを取り出すときに、セッションの生存時間が保存されているかどうかを判断する必要があることです。期限切れです。


キャッシュを利用してセッションを保存すると、保存時の生存時間を設定でき、取得後の無効判定のプロセスを軽減できます。

私の解決策は、入り口に次のコードを追加することです:

$session_value = serialize($_SESSION);


写真に示すように:

Site 1

Site 2

PHP でサブドメイン間でセッションを実装する 3 つの方法

2 つのサイトの PHPSESSID が同じであることがわかります。これにより、もちろん、クロスサブドメイン名の問題も解決されます

上記は、PHP のセッションでクロスサブドメインを実現するためのいくつかの解決策であると思います。それは困っているすべての人を助けることができます。

PHP でのセッション クロスサブドメインの 3 つの実装方法に関するその他の関連記事については、PHP 中国語 Web サイトに注目してください。

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