ホームページ  >  記事  >  バックエンド開発  >  PHP でのセッション学習

PHP でのセッション学習

不言
不言オリジナル
2018-05-07 09:21:021067ブラウズ

この記事では、主に PHP のセッションの学習について紹介します。必要な方は参考にしてください。

Web 開発の初心者が混同しやすい 2 つの概念です。両方を理解すると、Web インタラクションをより深く理解できるようになります。個人的には、セッションと Cookie の主な違いは次のとおりだと思います:

cookie

情報はクライアントに保存される

クライアントは特定の実装に責任を負う

データのサイズと量は一般的に制限がある

データの盗用や改ざんが容易

セッション

データはサーバー側に保存される

特定の実装はサーバーが責任を負う

原則としてデータのサイズと量は無制限

高いセキュリティと強い信頼性

狭義のセッションとはWebセッションにおけるセッションIDとそれに付随するデータを指し、広義のセッションとは通信する当事者間の対話的なセッションを指します。たとえば、ユーザーのログインはセッション インタラクションであり、ATM からのお金の引き出しはセッション インタラクションなどです。

セッションの詳細

セッションの主な機能は、セッションを識別し、セッション中のデータを保存することです。以下はセッションの詳細です。

Access

PHP は、$_SESSION スーパー グローバル変数を通じてセッション内のすべてのデータを取得して保存します。 $_SESSION は、簡単に割り当てて読み取ることができる配列です。例:

$name = $_SESSION['NAME'];  // 读取session中的name值
$_SESSION['NAME'] = 'new name';   // 赋新值
unset($_SESSION['NAME']);     // 移除session中的值

有効期限

デフォルトセッションのデータは、PHP Run Garage かどうかに応じて、セッションがタイムアウトした後に削除される可能性があります。速やかに回収。 PHP が実行するガベージ コレクションの係数はリクエストの数であるため、次のような結果が得られます。 1. トラフィックの少ないサイトのセッション データはタイムアウト後も長時間削除されません。 2. トラフィックの多いサイトはセッション ガベージ コレクションを頻繁に実行します。 3. ガベージの実行 ガベージ コレクションが実行されている場合、コレクションがユーザーの要求を実行する前にシステムの遅延が発生する可能性があります。より良い解決策は、PHP のデフォルトのガベージ コレクションを無効にし、cron タスクで session_gc 関数を定期的に実行することです。これにより、セッションの適時性が確保されるだけでなく、パフォーマンスとユーザー エクスペリエンスも向上します。

セッション内のデータを手動で削除するには、unset を使用して単一のデータ項目を削除するか、session_destroy 関数を使用してすべてのデータを強制的に削除します。

ストレージメディアとシリアル化

セッション内のデータは、デフォルトではファイルの形式でディスクに保存され、セッションが開かれると、ファイルの内容が読み取られて逆シリアル化され、$_SESSION 配列が保存されます。満たされました。トラフィックの多いサイトでは、セッション ファイルが保存されるディレクトリに多数の小さなファイルが含まれるため、ファイル システムに大きな IO 負荷がかかります。

セッションモジュールのハンドラーは、データベース、redis/memcache、その他のメディアにデータを保存するなど、データの保存方法を指定できます。 PHP の組み込みハンドラーには、ファイル (デフォルト)、redis、memcache が含まれます。ユーザーは、session_set_save_handler を通じて独自のハンドラーを登録できます。

セッションに保存されるデータは、文字列などの基本的な型である場合もあれば、配列やオブジェクトなどの複雑な型である場合もあります。セッション設定の Serialize_handler は、シリアル化および逆シリアル化のハンドラーを設定するために使用されます。ハンドラーがデータをシリアル化した後、データは保存のために save_handler に渡されます。シリアル化から、リソースなどの型はセッションに保存できないし、保存すべきではないことがわかります。 DB 接続ハンドルをセッションに保存し、10 分後に取り出して使用するという考えは、できるだけ早く破棄する必要があります。

セッション設定名

httpはステートレスプロトコルであるため、クライアントはリクエスト時にサーバーがセッションを区別できるようにセッションIDを伝える必要があります。セッション ID を識別するデフォルトの名前は PHPSESSID です。 session_name を使用して他の名前を設定できます。たとえば、攻撃者がバックエンドが PHP 言語システムであると推測できないようにするには、セッション ID の名前を JSESSIONID に設定して攻撃者を混乱させることができます。

セッションは自動的に開かれます

現在の主流の PHP バージョンは、デフォルトではセッションを自動的に開きません。たとえば、訪問者がページを閲覧するだけで終了する場合、セッションが自動的に開かれると、一連の初期化操作の後にセッション ID がクライアントに送信され、次回訪問時にユーザーを識別できるようになります。 1 回限りの訪問者、またはシステムにログインしていないユーザーの場合、これらの操作は追加のオーバーヘッドをもたらすだけです。

セッションが自動的に開かれないことの欠点は、セッションを使用する前にセッションが開いていることを確認する必要があることです。そうしないと、空のデータが取得される可能性があります。デフォルトのセッション名が変更された場合は、session_start の前に session_name を呼び出して、現在使用されているセッション名を示す必要があります。

分散セッション

トラフィックが多いサイトでは、バックエンドでサービスを提供する複数の PHP サーバーが存在することがよくあります。ユーザーの複数のリクエストが同じサーバーに到達せず、サーバーのセッション データが共有されない場合、ユーザーは繰り返しログインする必要がある場合があります。この問題は、フロントエンドでリクエストを分散するか、バックエンドで分散共有セッションをセットアップすることで解決できます。

セッション データをファイルの形式で保存するシステムでは、ディレクトリを共有ディレクトリとして指定でき、セッションを redis/memcache/db などに保存するシステムでは、すべてのサーバー セッションがこのディレクトリに保存されます。セッションサーバーはセッション共有を実現できます。セッション共有を使用して構築されたシステムでは、フロントエンド ロード バランサーはリクエストを任意のサーバーに分散できます。

関連する推奨事項:

PHP ログイン セッションを取得する

PHP はマルチサーバー SESSION 共有を実現します


以上がPHP でのセッション学習の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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