ホームページ >バックエンド開発 >PHPチュートリアル >PHPセッションの詳細分析_PHPチュートリアル

PHPセッションの詳細分析_PHPチュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:48:46877ブラウズ

1. PHPセッションの仕組み
デフォルトでは、SESSION ファイルが保存されるディレクトリは、sess_c72665af28a8b14c0fe11afe3b59b51b のように、ファイル名の先頭に sess_ が付けられ、その後に SESSION ID が続きます。ユーザーのファイルを取得し、クライアントから提供されたセッション ID に基づいて変数の値を取得できます。セッション ID は、クライアントの Cookie または Http1.1 プロトコルの Query_String (部分) を使用してサーバーに送信できます。アクセスされた URL の「?」の後)、サーバーはセッション ディレクトリを読み取ります。つまり、セッションIDはサービス上に保存されているセッション変数を取得するためのIDカードです。
session_start(); コードが実行されると、サーバー上にセッション ファイルが生成され、それに一意に対応するセッション ID が生成され、生成されたセッション ファイルに特定の形式で格納されるように定義されます。セッション ID を通じて、定義された変数を取得できます。ページを通過した後、セッションを使用するには、session_start() を再度実行する必要があります。別のセッション ファイルが生成され、それに応じて、このセッション ID を使用して最初のセッション ファイルを取得することはできません。このセッション ID はセッションを開くための「キー」ではないため、変数は入力されます。 session_start(); の前にコード session_id($session id); を追加すると、新しいセッション ファイルは生成されず、この ID に対応するセッション ファイルが直接読み取られます。
2. Session
の共通機能と使い方 2.1 Session_start(): セッションを開始するか、既存のセッションを返します。
この関数にはパラメータがなく、戻り値は true です。 Cookie ベースのセッションを使用する場合、Session_start() を使用する前にブラウザは出力を生成できません。php.ini で session.auto_start=1 を有効にすると、セッションを使用するたびに session_start() を呼び出す必要がなくなります。セッション。ただし、このオプションを有効にする場合はいくつかの制限があります。session.auto_start が実際に有効になっている場合は、セッション内でオブジェクトを再作成するためにセッションを開始する前にクラス定義をロードする必要があるため、オブジェクトをセッションに配置することはできません。
2.2 SESSION変数を登録:
PHP5 は、$_SESSION[‘xxx’]=xxx を使用して SESSION グローバル変数を登録します。 session_register() に注意してください
session_unregister、session_is_registered は、php.ini で変更されない限り、php5 では使用されなくなりました
Register_globle はオンに設定されていますが、セキュリティ上の理由から、 register_globle をオフにすることを強くお勧めします。
HTTP_SESSION_VARS の使用は推奨されなくなり、代わりに $_SESSION を使用することが公式に推奨されています。
Page1.php
session_start(); //この関数は SESSION を使用する前に呼び出す必要があります。
$_SESSION[‘name’]=”私はブラックトルネード李逵です!” //SESSION変数を登録します
; $_SESSION[‘passwd’]=”mynameislikui”;
$_SESSION[‘時間’]=時間();
// クライアントが Cookie をサポートしている場合、このリンクを通じてセッションを次のページに渡すことができます。
echo '
COOKIE を介して SESSION を渡す';
// クライアントが Cookie をサポートしていない場合、このメソッドを使用してセッションを渡します。
echo '
URL を通じて SESSION を渡す';
Page2.php
session_start();
echo $_SESSION['name'];
echo $_SESSION['passwd'];
echo date('Y m d H:i:s', $_SESSION['time']);
echo '
前のページに戻る';
?>
2.3 session_id ([ string $id ] ): 現在のセッション ID を取得および/または設定します
php5 では、session_id() を使用するか、URL に添付された SID を通じて現在のセッションの session_id と session_name を取得できます。
session_id() に特定の値がある場合 (つまり、パラメーター $id が指定されている場合)、現在の session_id 値が置き換えられます。この関数を使用する前にセッションを開始する必要があります: session_start();
例: セッションの有効期間を手動で設定します:
session_start();
// 1 日保存します
$lifeTime = 24 * 3600;
setcookie(session_name(), session_id(), time() + $lifeTime, "/");
?>
実際、Session には、Session の有効期間を設定するための関数 session_set_cookie_params() も用意されています。この関数は、session_start() 関数が呼び出される前に呼び出す必要があります。 // 1 日保存します
$lifeTime = 24 * 3600;
session_set_cookie_params($lifeTime);
session_start();
$_SESSION["管理者"] = true;
?>
クライアントが IE 6.0 を使用している場合、session_set_cookie_params() 関数で Cookie を設定する際に問題が発生するため、引き続き setcookie 関数を手動で呼び出して Cookie を作成します。
2.4 セッションが存在するかどうかを確認しますか?
以前の PHP バージョンでは、通常、セッションが存在するかどうかを確認するために session_is_register() が使用されていましたが、$_SESSION[‘XXX’]=XXX を使用してセッション変数を登録すると、session_is_register() 関数は機能しなくなります。
を使用できます 代わりに isset($_SESSION[‘xxx’]) を使用します。
2.5 session_id の変更 session_regenerate_id([bool $delete_old_session]) 変更が成功した場合は true を返し、失敗した場合は false を返します。
この関数を使用して現在のセッションの session_id を変更しますが、$delete_old_session が true でない限り、現在のセッションの他の情報はデフォルトでは変更されません。例:
session_start();
$old_sessionid = session_id();
session_regenerate_id();
$new_sessionid = session_id();
echo "元のセッションID: $old_sessionid
";
echo "新しいセッションID: $new_sessionid
";
echo"

";<br>
print_r($_SESSION);<br>
エコー"
";
?>
2.6 session_name() は、現在のセッションの名前を返すか、現在のセッションの名前を変更します。現在のセッションの名前を変更したい場合は、session_start() の前にこの関数を呼び出す必要があります。注: session_name は数字だけで構成することはできません。少なくとも 1 つの文字を含める必要があります。それ以外の場合は、毎回新しいセッション ID が生成されます。
セッション名の変更の例:
$previous_name = session_name("ウェブサイトID");
echo "新しいセッション名は $previous_name
";
?>

2.7 セッションの削除方法
(1) unset ($_SESSION['xxx']) は 1 つのセッションを削除します。unset ($_SESSION['xxx']) は、登録されているセッション変数の登録を解除するために使用されます。その機能は session_unregister() と同じです。 session_unregister() は PHP5 では使用されなくなったため、廃止される可能性があります。
unset($_SESSION) この関数は使用してはなりません。グローバル変数 $_SESSION が破壊され、それを復元する適切な方法はありません。ユーザーは $_SESSION 変数も登録できなくなります。
(2) $_SESSION=array() 複数のセッションを削除
(3) session_destroy() は現在のセッションを終了し、セッション内のすべてのリソースをクリアします。この関数は、現在のセッションに関連するグローバル変数の設定を解除したり、クライアントのセッション Cookie を削除したりすることはありません。Cookie を削除したい場合は、setcookie() 関数を使用する必要があります。
以下は、セッションの削除に関する公式の PHP ケースです:
//セッションを初期化します
session_start();
/**※すべてのセッション変数を削除する unset($_SESSION[xxx]) を使用して 1 つずつ削除することもできます。 ****/
$_SESSION = array();
/***セッション ID を削除します。セッションはデフォルトで Cookie ベースであるため、setCookie を使用してセッション ID を含む Cookie を削除します。***/
if (isset($_COOKIE[セッション名()])) {
setcookie(session_name(), '', time()-42000, '/');
}
//最後にセッションを完全に破棄します。
session_destroy();
?>
これからセッションを削除する手順を導き出すことができます:
①session_start()
②$_SESSION=array()/unset($_SESSION['xxx'])
③session_destroy()

3. セッションのクロスページ配信の問題:
3.1 セッション ID を渡す方法は 2 つあります: Cookie URL パラメーター
セッション モジュールは両方の方法をサポートします。 Cookie はより最適化されていますが、常に利用できるわけではないため、代替手段も提供されています。 2 番目の方法では、セッション ID を URL の途中に直接埋め込みます。
PHP はページ間のリンクを透過的に変換できます。 PHP 4.2 より前のバージョンを使用する場合は、PHP をコンパイルするときに --enable-trans-sid 構成オプションを使用して手動でアクティブ化する必要があります。この構成オプションと実行時オプション session.use_trans_sid が両方とも有効になっている場合 (php.ini を変更する)、相対 URI はセッション ID を含むように自動的に変更されます。
注: 非相対 URL は外部サイトを指していると想定されているため、SID が追加されません。これは、SID が別のサーバーに漏洩するセキュリティ リスクになる可能性があるためです。
あるいは、定数 SID を使用することもできます。クライアントがセッション Cookie を送信しない場合、SID は session_name=session_id の形式になります。それ以外の場合は空の文字列になります。したがって、無条件で URL に埋め込むことができます。
3. 2 ページ間セッション転送の問題を解決する 3 つの方法
①クライアントがCookieを無効にしている。
②ブラウザに問題があり、一時的にCookieにアクセスできなくなっています
③php.iniのsession.use_trans_sid = 0、またはコンパイル時に--enable-trans-sidオプションがオンになっていない
クライアントの Cookie が無効になっている場合、または問題が発生している場合、PHP は自動的にセッション ID を URL に付加し、セッション ID を介してセッション変数をページ間で使用できるようにします。ただし、この添付ファイルには特定の条件もあります。「php.ini で session.use_trans_sid = 1、またはコンパイル時に --enable-trans-sid オプションがオンになっている」。 上記の原則を理解すると、セッションのクロスページ転送の問題を解決する 3 つの方法が考えられます。
1. php.ini で session.use_trans_sid = 1 を設定するか、コンパイル時に --enable-trans-sid オプションをオンにして、PHP がページ間でセッション ID を自動的に渡すようにします。
(誰かが言いました: しかし、テスト中に、ページ内で header('location: xx.php') と javascript window.location=xx.php を使用するように php.ini を変更する方法では、望ましい効果が得られませんでした。現在は正常に見つかりました。 xx )
。 2. URL を通じて値を手動で渡し、非表示のフォームを通じてセッション ID を渡します。
3. session_id をファイル、データベースなどに保存し、クロスページ プロセス中に手動で呼び出します。
以下に例を示します:
最初の状況:
page1.php
session_start();
$_SESSION['var1']="中華人民共和国";
$url="次のページ";
$url をエコー;
?>
page2.php
session_start();
echo "渡されたセッション変数 var1 の値は次のとおりです: ".$_SESSION['var1'];
?>
上記のコードを実行すると、クライアント Cookie が正常であれば、「中華人民共和国」という結果が得られるはずです。
ここで、クライアント上の Cookie を手動で閉じて再度実行すると、結果が得られない可能性があります。結果が得られない場合は、php.ini で session.use_trans_sid = 1 を設定するか、コンパイル時に --enable-trans-sid オプションをオンにすると、「中華人民共和国」という結果が得られます
2 番目の方法:
s1.php
session_start();
$_SESSION['var1']="中華人民共和国";
$sn = session_id();
//PHP5 は session_id() を表す定数 SID を定義します。$url='Next page' と書くこともできます。
$url="次のページ";
$url をエコー;
?>


s2.php
session_id($_GET['s']);
session_start();
echo "渡されたセッション変数 var1 の値は次のとおりです: www.2cto.com".$_SESSION['var1'];
?>

3 番目の方法:
ログイン.html


<頭>
ログイン



ログインしてください:
<フォーム名="ログイン" メソッド="ポスト" アクション="mylogin1.php">
ユーザー名:

パスワード:






mylogin1.php
$name=$_POST['名前'];
$pass=$_POST['パス'];
if(!$name || !$pass) {
echo "ユーザー名またはパスワードが空です。再度ログインしてください";
死ぬ();
}
if (!($name=="老公" && $pass=="123")) {
echo "ユーザー名またはパスワードが間違っています。再度ログインしてください";
死ぬ();
}
//登録ユーザー
ob_start(); session_start();
$_SESSION['ユーザー']= $name;
$psid=session_id();
$fp=fopen("e:\tmp\phpsid.txt","w+");
fwrite($fp,$psid);
fclose($fp);
//本人確認が成功したので、関連する操作を実行します
echo "ログインしました
";
echo "次のページ";
?>
mylogin2.php

$fp=fopen("e:\tmp\phpsid.txt","r");
$sid=fread($fp,1024);
fclose($fp);
session_id($sid);
session_start();
if(isset($_SESSION['user']) && $_SESSION['user']="laogong" ) {
echo "ログインしました!";
}
他に{
// ログインに成功し、関連する操作を実行します
echo "ログインしていません。アクセス権がありません";
echo "ログインして閲覧してください";
死ぬ();
}
?>
4.複数サーバーで同じセッションを共有する場合の解決策について
やや大きな Web サイトでは通常、複数のサーバーがあり、各サーバーは異なる機能を持つモジュールを実行し、異なる第 2 レベルのドメイン名を使用します。ただし、総合的な Web サイトの場合、ユーザー システム、つまりユーザー名のセットは統一されています。 Web サイト全体のすべてのモジュールにログインするために使用されます。各サーバーがユーザー データを共有するのは比較的簡単で、バックエンドにデータベース サーバーを配置するだけで済み、各サーバーは統一されたインターフェイスを通じてユーザー データにアクセスできます。しかし、まだ問題があります。つまり、ユーザーがこのサーバーにログインした後、別のサーバーの他のモジュールに入るときに、再度ログインする必要があります。これは 1 回限りのログインであり、一般的な問題はすべて にマッピングされています。実際には、さまざまなサーバー間で SESSION データを共有する方法です。
SESSION データを共有したい場合は、2 つの目標を達成する必要があります。1 つは、同じクライアントに対して各サーバーによって生成された SESSION ID が同じである必要があり、同じ COOKIE を介して渡せることです。つまり、各サーバーは次のことを行うことができなければなりません。もう 1 つは、SESSION データの保存方法と場所が各サーバーにアクセスできるようにする必要があることです。簡単に言えば、複数のサーバーはクライアントの SESSION ID を共有し、サーバーの SESSION データも共有する必要があります。
最初の目標の実現は実際には非常に簡単です。デフォルトでは、COOKIE のドメインは現在のサーバーのドメイン名/IP アドレスになります。各サーバーのドメインは異なります。たとえば、www.2cto.com のサーバーは、www.bbb.com のサーバーが設定した COOKIE を読み書きすることはできません。ここで説明している同じ Web サイトのサーバーにはそれぞれ独自の特徴があります。つまり、同じ第 1 レベルのドメインに属しています。たとえば、aaa.infor96.com と www.infor96.com は両方ともドメイン .infor96 に属しています。 .com の場合、COOKIE のドメインを .infor96.com に設定して、aaa.infor96.com、www.infor96.com などがこの COOKIE にアクセスできるようにします。 PHPコードでの設定方法は以下の通りです
コード:
ini_set('session.cookie_domain', '.infor96.com');
2 番目の目的は、NFS などのファイル共有方法を使用して達成できますが、セットアップと操作はやや複雑です。前述のユーザー システムを統合する方法、つまりデータベースを使用して SESSION データを保存する方法を参照すると、各サーバーが同じデータ ソースに簡単にアクセスして同じ SESSION データを取得できます。
セッションをデータベースに入れる方法については、「phpプログラミング」や以下のページをご覧ください
http://www.eb163.com/article.php?id=75&PHPSESSID=d226cc07cec0580ec7dad47119ee4667 Heda Li Xin のクレイジー コーディング ライフより抜粋


www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/478394.html技術記事 1. PHP セッションの動作原理 セッション ファイルはサーバー側に保存されます。デフォルトでは、SESSION ファイルが保存されるディレクトリは、sess_ の後に S...
が続きます。
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。