ホームページ  >  記事  >  バックエンド開発  >  thinkPHPのセッションデータをmemcacheを使って複数のドメイン名で共有する実装方法_phpの例

thinkPHPのセッションデータをmemcacheを使って複数のドメイン名で共有する実装方法_phpの例

WBOY
WBOYオリジナル
2016-08-04 08:56:491074ブラウズ

この記事の例では、memcache を使用して thinkPHP のセッション データを複数のドメイン名で共有する実装方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです:

1. 問題の原因

少し大きな Web サイトには通常、複数のサーバーがあり、それぞれのサーバーが異なる機能を持つモジュールを実行し、異なる第 2 レベルのドメイン名を使用します。ただし、総合的な Web サイトの場合、ユーザー システム、つまり一連のユーザー名が使用されます。ウェブサイト全体の各モジュールにログインするために使用できます。各サーバーがユーザー データを共有するのは比較的簡単で、バックエンドにデータベース サーバーを配置するだけで済み、各サーバーは統一されたインターフェイスを通じてユーザー データにアクセスできます。しかし、まだ問題があります。つまり、ユーザーがこのサーバーにログインした後、別のサーバーの他のモジュールに入るときに、再度ログインする必要があります。これは 1 回限りのログインであり、一般的な問題はすべて にマッピングされています。実際には、さまざまなサーバー間で SESSION データを共有する方法です。

2. PHP セッションの仕組み

問題を解決する前に、まず PHP SESSION がどのように機能するかを理解しましょう。クライアント (ブラウザなど) が Web サイトにログインすると、訪問した PHP ページは session_start() を使用して SESSION を開くことができ、これによりクライアントの一意の識別 SESSION ID が生成されます (この ID は session_id 関数を通じて取得/設定できます) ())。 SESSION ID は 2 つの方法でクライアントに保持できるため、別のページをリクエストするときに、PHP プログラムはクライアントの SESSION ID を学習できます。1 つは、デフォルトで GET URL または POST フォームに SESSION ID を自動的に追加することです。以下では、変数名は PHPSESSID です。もう 1 つは、COOKIE を通じてセッション ID を保存することです。デフォルトでは、この COOKIE の名前は PHPSESSID です。ここでは、広く使われている COOKIE メソッドを中心に説明します。

それでは、SESSION データはどこに保存されるのでしょうか?もちろんサーバー側では、メモリに保存されるのではなく、ファイルまたはデータベースに保存されます。デフォルトでは、php.ini で設定される SESSION の保存方法はファイル (session.save_handler = files) です。つまり、ファイルの読み書きによって SESSION データが保存され、SESSION ファイルが保存されるディレクトリはセッションによって指定されます。 save_path であり、ファイル名は sess_c72665af28a8b14c0fe11afe3b59b51b のように、sess _ で始まり、その後に SESSIONID が続くプレフィックスです。ファイル内のデータはシリアル化後の SESSION データです。アクセス量が多い場合は、さらに多くの SESSION ファイルが生成される可能性があります。この場合、SESSION ファイルを保存するための階層ディレクトリを設定すると、効率が大幅に向上します。 session.save_path= N;/save_path"、N は階層レベル、save_path は開始ディレクトリです。 SESSION データを書き込むとき、PHP はクライアントの SESSION_ID を取得し、この SESSION ID を使用して、指定された SESSION ファイル格納ディレクトリ内で対応する SESSION ファイルを検索し、存在しない場合は作成し、最後にデータをシリアル化して書き込みます。ファイル。 。 SESSION データの読み取りも同様の操作プロセスで、読み取りデータを逆シリアル化する必要があり、対応する SESSION 変数が生成されます。

3. 複数のサーバー間で SESSION を共有する際の主な障害と解決策

SESSION の動作原理を理解すると、デフォルトで各サーバーが同じクライアントに対してそれぞれ SESSION ID を生成することがわかります。たとえば、同じユーザー ブラウザの場合、サーバー A によって生成される SESSION ID は 30de1e9de3192ba6ce2992d27a1b6a0a です。 B 生成されるものは c72665af28a8b14c0fe11afe3b59b51b です。また、PHP の SESSION データは、このサーバーのファイル システムに別途保存されます。

問題を特定したら、解決を開始できます。 SESSION データを共有したい場合は、2 つの目標を達成する必要があります。1 つは、同じクライアントに対して各サーバーによって生成された SESSION ID が同じである必要があり、同じ COOKIE を介して渡せることです。つまり、各サーバーは次のことを行うことができなければなりません。同じ SESSION ID を読み取ります。もう 1 つは、すべてのサーバーがアクセスできる必要がある SESSION データの保存方法/場所です。簡単に言えば、複数のサーバーはクライアントの SESSION ID を共有し、サーバーの SESSION データも共有する必要があります。

最初の目標の実現は、実際には、COOKIE のドメインを特別に設定するだけで済みます。デフォルトでは、COOKIE のドメインは、各サーバーのドメイン名/IP アドレスになります。設定された COOKIE は相互にアクセスできません。たとえば、www.aaa.com のサーバーは、www.bbb.com のサーバーが設定した COOKIE を読み書きすることはできません。ここで説明している同じ Web サイトのサーバーにはそれぞれ独自の特徴があります。つまり、同じ第 1 レベルのドメインに属しています。たとえば、tieba.xiaoyuan.com と www.xiaoyuan.com はどちらもドメイン .xiaoyuan に属しています。 .com の場合、COOKIE のドメインを .xiaoyuan.com に設定して、tieba.xiaoyuan.com、www.xiaoyuan.com などがこの COOKIE にアクセスできるようにします。 PHPコードでの設定方法は以下の通りです

リーリー

このようにして、各サーバーが同じクライアント SESSION ID を共有するという目的が達成されます。

2 番目の目標は、ファイル共有を使用することで達成できます。これを解決するには 2 つの方法があります。1 つはデータ ストレージ セッションを使用することで、もう 1 つは memcache を試すことです。ここで MEMCACHE を使用して解決してください。

私はセッションへの memcache アクセスをすでにサポートしている thinkphp フレームワークを使用しています。memcache サーバーを設定した後は、構成ファイルで memcache IP とポートを設定し、COOKIE_DOMAIN パラメーターを指定するだけで、通常どおりに操作できます。セッションモードで動作し、複数のドメイン名でセッションを共有できるようになりました

より thinkPHP 関連のコンテンツに興味のある読者は、このサイトの特別トピックをチェックしてください: 「ThinkPHP 入門チュートリアル」、「ThinkPHP テンプレート操作スキルの要約」、「ThinkPHP の共通メソッドの要約」、「Smarty テンプレートの基本チュートリアル」、 「PHPテンプレート技術」まとめ」です。

この記事が皆さんの ThinkPHP フレームワークに基づく PHP プログラムの設計に役立つことを願っています。

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