現在、多くの機密情報 Web サイトには、sh.ganji.com (Shanghai Ganji Network)、su.ganji.com (Suzhou Ganji Network) など、複数のドメイン名を持つ多数の第 2 レベル ドメイン名が設定されています。このように、第 2 レベル ドメイン名の Web サイトが同期セッション共有を実現するにはどうすればよいでしょうか? ここでは、複数のサーバーに関する問題については説明しません。同じサーバー上の複数の第 2 レベル ドメイン名 Web サイトがセッションを共有する方法についてのみ説明します。
この問題について話す前に、まず 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_ で始まり、その後にセッション ID が続きます。ファイル内のデータはシリアル化後の SESSION データです。アクセス数が多い場合は、さらに多くの SESSION ファイルが生成される可能性があります。この場合、SESSION ファイルを保存するための階層ディレクトリを設定すると、設定方法が大幅に向上します。 session.save_path= N;/save_path"、N は階層レベル、save_path は開始ディレクトリです。 SESSION データを書き込むとき、PHP はクライアントの SESSION_ID を取得し、この SESSION ID を使用して、指定された SESSION ファイル格納ディレクトリ内で対応する SESSION ファイルを検索し、存在しない場合は作成し、最後にデータをシリアル化して書き込みます。ファイル。 SESSION データの読み取りも同様の操作プロセスで、読み取りデータを逆シリアル化する必要があり、対応する SESSION 変数が生成されます。
PHP セッションの動作原理を理解することで、セッション共有の問題を解決する 2 つの方法が考えられます。
(1) COOKIE を使用して session_id();
を保存します
ドメイン名ファイルの PHP コード:
<?php session_start(); setcookie("session_id",session_id(),time()+3600*24*365*10,"/",".Alixixi.com"); $_SESSION['user_name']='hello'; echo $_SESSION['user_name']; ?>
ドメイン名 2 番目のファイル PHP コード:
<?php session_destroy(); session_id($_COOKIE['session_id']); session_start(); echo $_SESSION['user_name']; ?>
(2) php.ini の session.cookie_domain を使用する
注: これは、php.ini の構成ファイルを変更せずに、PHP コードを使用して実装されます。必要に応じて、php.ini の構成ファイルを変更できます (この場合、コードを変更する必要はありません:ini_set("session. cookie_domain", 'session.com');)
ドメイン名ファイルの PHP コード:
<?php ini_set("session.cookie_domain",'Alixixi.com');//注:该参数必须在sesson_start()之上,否则将不会生效 session_start(); $_SESSION['user_name']='梁山良民'; echo $_SESSION['user_name']; ?>
ドメイン名 2 番目のファイル PHP コード:
<?php ini_set("session.cookie_domain",'Alixixi.com'); session_start(); echo $_SESSION['user_name']; ?>
次の 2 つの問題には注意が必要です:
1: ini_set("session.cookie_domain",'session.com'); は session_start() の前に配置する必要があります。
2: 一部の Web サイトをテストする場合は注意が必要です。ローカルでは問題がない場合でも、他のマシンまたはサーバーに問題がある場合は、ini_set("session.cookie_domain",'session.com'); を確認する必要があります。 com in はドメイン名と一致する必要があります。そうしないと、セッション値の一部に問題が発生します。
興味のある記事