ホームページ >バックエンド開発 >PHPチュートリアル >PHP でのセッションと thinkphp_PHP でのセッションの使用法チュートリアル

PHP でのセッションと thinkphp_PHP でのセッションの使用法チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:49:41919ブラウズ

セッションは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 に基づいてクライアントのデータ ステータスを取得できるようになります。

クライアントのブラウザが予期せず閉じられた場合、サーバーによって保存されたセッション データはこの時点ではまだ存在しますが、session_id がわかっている限り、リクエストを通じてセッション情報を取得し続けることができます。現時点では、バックグラウンド セッションはまだ存在しますが、セッションの保存には有効期限があります

。 指定された時間を超えてクライアント要求がない場合、セッションはクリアされます。

以下では、セッション保存メカニズムを紹介します。デフォルトのセッションはファイルに保存されます。つまり、セッションデータはファイルの形式で保存されます。 phpでは主にphp.iniのsession.save_handlerの設定に基づいています

をクリックしてセッションを保存する方法を選択します。

ちなみに、サーバー LVS、つまり複数のサーバーを作成したい場合、通常は memcached セッションを使用します。そうしないと、一部のリクエストがセッションを見つけることができなくなります。

単純な memcache 構成:

session.save_handler = memcache session.save_path = "tcp://10.28.41.84:10001"

もちろん、ファイル ファイル キャッシュを使用する必要がある場合は、nfs を使用してファイルを保存し、保存されたすべてのセッション ファイルを 1 か所に配置できます。

ここで、ユーザーに返されたセッション ID が最終的にメモリに保存され、ユーザーの URL に保存するパラメーターを設定することもできます。



ThinkPHP 公式ドキュメント

01.start セッションを開始します

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オブジェクトが逆シリアル化されるときにコールバック関数を設定します
最も一般的なハウツーの例:

コード: 01.//セッション変数が存在するかどうかを検出します

セッションに関連する設定パラメータ:
コードは次のとおりです コードをコピー

02.Session::is_set('name');

03. //セッション変数に値を代入します
04.
セッション::set('名前','値'); 05.
// セッション変数を取得します
06.
セッション::get('名前');

コード:

コードは次のとおりです01.'SESSION_NAME'=>'ThinkID', // デフォルトのセッション名SESSION_NAME パラメータに注意する必要があります。異なるプロジェクト間でセッションの値を共有する必要がない場合は、別の値を設定してください。それ以外の場合は、同じデフォルト値を維持してください。
コードをコピー

02.

'Session_path' = & gt '', // デフォルトのセッション保存パスを使用します


; 03.
'Session_type' = & gt', // デフォルトのセッション タイプ タイプは DB と FILE をサポートします
; 04.
'SESSION_EXPIRE' =&gt; '300000'、//デフォルトセッションの妥当性期間
05.
'SESSION_TABLE'=>'think_session', // データベース セッション モード テーブル名
06.
'SESSION_CALLBACK' =&gt; ''、//オブジェクトを降らせるためのコールバックメソッド

同じ SESSION_NAME 値が設定されているが、プロジェクトに基づいてプライベート セッション スペースを作成したい場合は、どうすればよいでしょうか? ThinkPHP は、プロジェクトをセッション空間として使用するプライベート セッション操作もサポートしています。例として、これを次のように変更します。

コード:

コードは次のとおりですコードをコピー01.//セッション変数が存在するかどうかを検出します(現在のプロジェクトが有効であるかどうか) 02.Session::is_setLocal('name');ThinkPHP は、SESSION_TYPE の値を DB に設定するだけで、SESSION_TABLE の値を設定し、次の DDL をデータベースにインポートします (MySQL を例にします)。 コード:

03. // セッション変数に値を割り当てます (現在のプロジェクトに有効)
04.

セッション::setLocal('名前','値'); 05.

// セッション変数を取得します (現在のプロジェクトに有効)
06.
Session::getLocal('name');




この方法では、グローバルなセッション操作と競合せず、いくつかの特別な状況に使用できます。

コードは次のとおりです

コードをコピー

01.CREATE TABLE `think_session` (02. id` int(11) unsigned NOT NULL auto_increment、 03. session_id` varchar(255) NOT NULL、
04.

session_expires` int(11) NOT NULL、

05.

session_data` blob、
06.
主キー (`id`)
07.)



Db セッション モードでのデータベース接続では、接続するプロジェクトのデータベース構成情報が使用されることに注意してください。データベース メソッドに加えて、メモリ メソッド、Memcache メソッドなどの他のセッション保存メカニズムのメソッドを追加することもできます。必要なのは、session_set_save_handler メソッドを使用して、対応するフィルタを追加することだけです。具体的なメソッドの定義については、を参照してください。 Think.Util.Filter の下の FilterSessionDb の .class.php ファイルの実装。

簡易ログイン判定を作成しました

ログイン検出後、セッション値が空または false になるようにセッション値を割り当てます

コードは次のとおりです コードをコピー
$_SESSION[C('USER_AUTH_KEY')] = $logInFind['id'] ;

ここで、[C('USER_AUTH_KEY')] は ThinkPHP の組み込みメソッドおよび関数クラスです。 config.php ファイルが設定されていない場合、デフォルトは空になります
$logInFind['id'] で取得したアカウント値を指定します。デフォルトでは、ページを閉じるとセッションが自動的に削除されます。

他のページを判断するには次のフォーマットを使用してください

コードは次のとおりです コードをコピー
if(!isset($_SESSION[C('USER_AUTH_KEY')])) { //isset は変数に値が割り当てられているかどうかを確認することです!
$this->redirect('Login','Login') //登録ページに移動します
}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/632699.html技術記事 Session は PHP で非常によく使われるグローバル変数です。ここで、PHP セッションについての使い方の概要を初心者向けに紹介します。次は...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。