ホームページ >バックエンド開発 >PHPチュートリアル >PHP でのセッションと thinkphp_PHP でのセッションの使用法チュートリアル
セッションはphpで非常に一般的に使用されるグローバル変数です。ここで、phpセッションの使用方法を初心者にいくつか紹介します。一緒に見てみましょう。
PHP サーバーのデフォルトのセッション保存方法は、Windows では、C:/WINDOWS/Temp に保存されます。*NIX では、同時アクセスの場合、デフォルトで /tmp に保存されます。作成されるセッションが多すぎると、これら 2 つのディレクトリに sess_xxxxxx に似たセッション ファイルが大量に存在することになり、パフォーマンスが低下し、攻撃が発生し、最終的にはファイル システム エラーが発生する可能性があります。この状況に対しては、PHP 自体がより良い解決策を提供します。
多くの友人は、php.ini のセッション設定セクションにこのような項目があることに気づいていないかもしれません:
; session.save_path = "N; モード; /パス"
この設定により、セッション保存ディレクトリでマルチレベルのハッシュを実行できます。「N」は設定するディレクトリ レベルを表し、「MODE」はディレクトリの権限属性を表します。デフォルトは 600 です。 WINDOWS では設定する必要はありません。*NIX では設定する必要はありません。次の「/path」は、セッション ファイルが保存されているルート ディレクトリのパスを表します。
session.save_path = "2; /tmp/phpsession"
上記の設定は、PHP セッション ファイルを保存するルート ディレクトリとして /tmp/phpsession ディレクトリを使用し、このディレクトリで 2 レベルのディレクトリ ハッシュを実行することを意味します。ディレクトリの各レベルは 0 ~ 9 と a ~ z で、合計が 0 ~ 9 です。 36 個の英数字のディレクトリ名。セッションを保存するディレクトリの数は 36*36 に達します。システム アーキテクチャが複数のサーバーとセッション データを共有するように設計されている場合は、ディレクトリ レベルを 36 まで増やすことができます。レベル3以上。
php 自体はサブディレクトリを自動的に作成しないことに注意してください。ディレクトリを自動的に作成するための次のコードは参考として使用できます。以下のコードはレベル 3 のサブディレクトリを自動的に作成します。これは必要に応じて変更できます。
コードは次のとおりです | コードをコピー |
set_time_limit(0); $string = '0123456789abcdefghijklmnopqrstuvwxyz'; $length = strlen($string); 関数 makeDir($param) { if(!file_exists($param)) { makeDir(ディレクトリ名($param)); mkdir($param); } } for($i = 0; $i < $length; $i++) { for($j = 0; $j < $length; $j++) { for($k = 0; $k < $length; $k++) { makeDir($string[$i].'/'.$string[$j].'/'.$string[$k]); } } } ?> |
より良い 2 つの解決策を以下に示します:
1.セッションストレージ
session_set_save_handler関数を使用する
機能: SESSIONストレージメカニズムをカスタマイズします。
セッションストレージなどの操作の実行など、セッションストレージメディアの変更に使用できます。
サンプルコード
コードは次のとおりです | コードをコピー |
クラスセッションテーブルはdbを拡張します{ Protected $table_name = 'セッション'; パブリック関数 __construct(){ 親::__construct(); session_set_save_handler( array($this,'sess_open'), array($this,'sess_close'), array($this,'sess_read'), array($this,'sess_write'), array($this,'sess_destroy'), 配列($this,'sess_gc') ); session_start(); } パブリック関数 sess_open($save_path,$session_name){ true を返します; } パブリック関数 sess_close(){ true を返します; } パブリック関数 sess_read($sess_id){ $sql = "select * from {$this->getTable()} where sess_id='{$sess_id}'"; $row = $this->getRow($sql); return $row['sess_data']; } パブリック関数 sess_write($sess_id,$sess_data){ $expire = time(); $sql = "重複キーの {$this->getTable()} の値 ('{$sess_id}','{$sess_data}','{$expire}') を挿入します 更新 sess_data='{$sess_data}',expire='{$expire}'"; return $this->query($sql); } パブリック関数 sess_destroy($sess_id){ $sql = "{$this->getTable()} から削除 (sess_id='{$sess_id}')"; return $this->query($sql); } パブリック関数 sess_gc($life_time){ $expire = time() - $life_time; $sql = "期限切れ return $this->query($sql); } } |
2. memcache を使用してセッションを保存します
方法 I: php.ini でグローバルに設定する
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
方法 II: 特定のアプリケーションで ini_set 設定を使用する
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211");
複数の memcached サーバーを使用する場合は、それらをカンマ「,」で区切ります。Memcache::addServer() ドキュメントで説明されているように、追加パラメーター「persistent」、「weight」、「timeout」、「retry_interval」などを取得できます。お待ちください。「tcp://host1:port1?persistent=1&weight=2,tcp://host2:port2」のようなものです。
1. phpでセッションを操作する方法:
session_start(); //この関数を使用してセッション関数を開きます
$_SESSION //事前定義されたグローバル変数を使用してデータを操作します
Use unset($_SESSION['key']) //セッションの値を破棄します
操作が簡単で、すべてがサーバーによって実装されるため、処理がバックグラウンドで行われるため、すべてが安全に見えます。しかし、セッションはどのようなメカニズムを使用し、どのように実装され、セッション状態はどのように維持されるのでしょうか?
2.セッションの実装と動作原理
ブラウザとサーバーは http ステートレス通信を使用し、クライアントの状態を維持するためにセッションを使用します。しかし、サーバーはどのようにしてさまざまなクライアントやユーザーを識別するのでしょうか?
ここで、人生の例を見てみましょう。パーティーに参加してたくさんの人に会った場合、さまざまな人をどのように区別しますか?顔の形やユーザーの名前に基づいて決定することもできます
または、一意の ID を使用する個人の ID カード。セッション メカニズムでは、このような一意の session_id はさまざまなユーザーを識別するためにも使用されます。違いは、ブラウザーがリクエストごとに
をもたらすことです。
サーバーによって生成された session_id
プロセスの簡単な紹介: クライアントがサーバーにアクセスすると、サーバーは必要に応じてセッションを設定し、セッション情報をサーバーに保存し、セッションを示す session_id をクライアントのブラウザーに渡します。
ブラウザはこの session_id をメモリに保存します (URL に書き込むなど、他の保存方法もあります)。これを有効期限のない Cookie と呼びます。ブラウザを閉じると、この Cookie はクリアされ、ユーザーの一時 Cookie ファイルは含まれなくなります。
将来的には、ブラウザはこのパラメータ値をすべてのリクエストに追加し、サーバーはこの session_id に基づいてクライアントのデータ ステータスを取得できるようになります。
。
指定された時間を超えてクライアント要求がない場合、セッションはクリアされます。
をクリックしてセッションを保存する方法を選択します。
単純な memcache 構成:
session.save_handler = memcache
session.save_path = "tcp://10.28.41.84:10001"
ここで、ユーザーに返されたセッション ID が最終的にメモリに保存され、ユーザーの URL に保存するパラメーターを設定することもできます。
ThinkPHP 公式ドキュメント
02.pause セッションを一時停止します
03.クリアクリアセッション
04.デストロイ デストロイセッション
05.get セッション値を取得します
06.getLocalはプライベートセッション値を取得します
07.set セッション値を設定します
08.setLocal はプライベートセッション値を設定します
09.name は session_name を取得または設定します
10.is_set セッション値を設定するかどうか
11.is_setLocal プライベートセッション値を設定するかどうか
12.id session_id を取得または設定します
13.path session_save_path を取得または設定します
14.setExpire セッションの有効期限を設定します
15.setCookieDomain は有効なドメイン名を設定します
16.setCallbackは、Sessionオブジェクトが逆シリアル化されるときにコールバック関数を設定します
最も一般的なハウツーの例:
コードは次のとおりです | コードをコピー |
02.Session::is_set('name'); 03.
//セッション変数に値を代入します |
コード:
コードをコピー | |
02. 'Session_path' = & gt '', // デフォルトのセッション保存パスを使用します |
コード:
コードは次のとおりです
03.
// セッション変数に値を割り当てます (現在のプロジェクトに有効)
// セッション変数を取得します (現在のプロジェクトに有効) | ThinkPHP は、SESSION_TYPE の値を DB に設定するだけで、SESSION_TABLE の値を設定し、次の DDL をデータベースにインポートします (MySQL を例にします)。
コードは次のとおりです
コードをコピー
01.CREATE TABLE `think_session` ( | 02. id` int(11) unsigned NOT NULL auto_increment、 | ||||||||
04. session_expires` int(11) NOT NULL、 05.
session_data` blob、 Db セッション モードでのデータベース接続では、接続するプロジェクトのデータベース構成情報が使用されることに注意してください。データベース メソッドに加えて、メモリ メソッド、Memcache メソッドなどの他のセッション保存メカニズムのメソッドを追加することもできます。必要なのは、session_set_save_handler メソッドを使用して、対応するフィルタを追加することだけです。具体的なメソッドの定義については、を参照してください。 Think.Util.Filter の下の FilterSessionDb の .class.php ファイルの実装。 簡易ログイン判定を作成しました ログイン検出後、セッション値が空または false になるようにセッション値を割り当てます
ここで、[C('USER_AUTH_KEY')] は ThinkPHP の組み込みメソッドおよび関数クラスです。 config.php ファイルが設定されていない場合、デフォルトは空になります 他のページを判断するには次のフォーマットを使用してください
|