English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
PHPでは$_SESSIONを使用してsessionを操作しますが、ThinkPHPはsessionの封装関数session()を提供します。この関数はsessionの追加、削除、変更、検索の機能を実現します。以下にその使用例と実現方法を見てみましょう。
このsession()関数の定義はCommon内で行われています。/functions.phpで定義されています。
session設定
session($name='',$value='')関数には2つの引数があります。$nameが配列の場合はsessionの設定を行います。以下のように使用します:
$name = array( ‘name’=>'name', ‘path’=>'/tmp/', ‘expire’=>0 ); session($name);
これらはsessionを開始する前に設定されるものです。ThinkPHPでこの関数を定義する際には、まず$nameが配列かどうかを判断し、配列であればsessionの設定であると判断し、その後の適切なコードを実行します。
その実装コードは以下の通りです:
if(is_array($name)) { // session初期化はsession_startの前に呼び出します。 if(isset($name['prefix'])) C('SESSION_PREFIX',$name['prefix']); if(C('VAR_SESSION_ID') && isset($_REQUEST[C('VAR_SESSION_ID')])){ session_id($_REQUEST[C('VAR_SESSION_ID')]); } elseif (isset($name['id'])) { session_id($name['id']); } if('common' != APP_MODE){ // 他のモードではサポートされていない可能性があります。 ini_set('session.auto_start', 0); } isset($name['name'])があれば、session_name($name['name']); isset($name['path'])があれば、session_save_path($name['path']); isset($name['domain'])があれば、ini_set('session.cookie_domain', $name['domain']); if(isset($name['expire'])) { ini_set('session.gc_maxlifetime', $name['expire']); ini_set('session.cookie_lifetime', $name['expire']); } if(isset($name['use_trans_sid'])) ini_set('session.use_trans_sid',$name['use_trans_sid']?1:0); if(isset($name['use_cookies'])) ini_set('session.use_cookies', $name['use_cookies']?1:0); if(isset($name['cache_limiter'])) session_cache_limiter($name['cache_limiter']); if(isset($name['cache_expire'])) session_cache_expire($name['cache_expire']); if(isset($name['type'])) C('SESSION_TYPE',$name['type']); …… }
ThinkPHPでは、セッションのストレージシステムにはmysqlとmemcacheの2つのデータベースが提供されています。もちろん、デフォルトではファイルストレージを使用しています。セッションのストレージ方法を判断するコードは以下の通りです:
if(C('SESSION_TYPE')) { // セッション・ドライバを読み取ります $type = C('SESSION_TYPE'); //システムがmysqlドライバを呼び出しています $class = strpos($type,'\\')? $type : 'Think\\Session\\Driver\\'. ucwords(strtolower($type)); $hander = new $class(); //ハンドラをインスタンス化 //レジスタート・ハンドラ session_set_save_handler( array(&$hander,"open"), array(&$hander,"close"), array(&$hander,"read"), array(&$hander,"write"), array(&$hander,"destroy"), array(&$hander,"gc") ); }
セッションの保存システムの設定は、設定オプションSESSION_TYPEで設定されます。
SESSION_TYPE=>'Mysql' //セッションをMySQLデータベースに保存します
設定が完了した後、セッションの自動開始が設定されている場合、システムは自動的にセッションを開始します
// セッションを開始します if(C('SESSION_AUTO_START')) session_start();
セッションの自動開始をオフにする場合は、オプションSESSION_AUTO_STARTを以下のように設定します:
SESSION_AUTO_START => false
システムの自動開始をオフにした場合、プロジェクトのパブリックファイルまたはコントローラーで手動でsession_start()を呼び出してセッションを開始することができます。または、関数session()を使用して、以下のように開始方法があります:
session(‘[start]');
ThinkPHPではその実装コードは以下の通りです:
if('[pause]'==$name){ // セッションを一時停止します session_write_close(); }elseif('[start]'==$name){ // セッションを開始します session_start(); }elseif('[destroy]'==$name){ // セッションを削除 $_SESSION = array(); session_unset(); session_destroy(); }elseif('[regenerate]'==$name){ // IDを再生成します session_regenerate_id(); }
session割り当て
session割り当ては非常にシンプルで、直接使用します:
session('name','onmpw');
これに加えて、キー値は「.'で接続された階層的な中間層を持つこともできます。
session(‘name1.name2','onmpw'); //等价于 $_SESSION[‘name1'][‘name2'] = ‘onmpw';
ThinkPHPではセッションの割り当て実装コードは以下の通りです:
if(strpos($name,'.')){ リスト($name1,$name2) = explode('.',$name); if($prefix){ $_SESSION[$prefix][$name1[$name2] = $value; }else{ $_SESSION[$name1[$name2] = $value; } }else{ if($prefix){ $_SESSION[$prefix][$name] = $value; }else{ $_SESSION[$name] = $value; } }
プレフィックスはオプションSESSION_PREFIXで設定されます。
セッションの取得
セッションの取得は比較的簡単です。
まずはすべてのセッションを取得する方法です。以下のように使用します
$values = session();
この場合、配列が取得されます。ThinkPHPでの実装コードは以下の通りです:
if(''===$name){ // すべてのセッションを取得 return $prefix ? $_SESSION[$prefix] : $_SESSION; }
次に単一の値を取得する方法です
$value1 = session('name'); //または $value2 = session('name1.name2');
その実装コードは以下の通りです:
if(strpos($name,'.')){ リスト($name1,$name2) = explode('.',$name); return isset($_SESSION[$name1[$name2])?$_SESSION[$name1[$name2]:null; }else{ return isset($_SESSION[$name])?$_SESSION[$name]:null; }
セッション削除
セッションの削除は、セッションを空にする、セッションを削除する、単一のセッション値を削除するの3種類があります。
まずはセッションを空にするについて説明します。セッションを空にする場合、$nameにnullを渡します
session(null); //セッションを空にする
その実装コードは以下の通りです:
if(is_null($name)){ // セッションを空にする if($prefix) { unset($_SESSION[$prefix]); }else{ $_SESSION = array(); } }
セッションを空にするのは、セッションが対応するファイルまたはテーブルのデータをクリアするだけで、ファイルは存在します。
セッションを削除
session('[destroy]');
ThinkPHPでの実装コードは以下の通りです:
if('[destroy]'==$name){ // セッションを削除 $_SESSION = array(); session_unset(); session_destroy(); }
セッションを削除すると、セッションとファイルが同時に削除されます。
最後に単一のセッション値を削除する方法です。以下のように使用します
session('name',null);
単一のセッション値を削除する場合、$valueの値をnullに設定するだけで削除できます。
if(is_null($value)){ // セッションを削除 if(strpos($name,'.')){ リスト($name1,$name2) = explode('.',$name); if($prefix){ unset($_SESSION[$prefix][$name])1[$name2]); }else{ unset($_SESSION[$name])1[$name2]); } }else{ if($prefix){ unset($_SESSION[$prefix][$name]); }else{ unset($_SESSION[$name]); } } }
セッションのチェック
最後に、セッションのチェックについて簡単に紹介します。チェックとは、変数が存在するかどうかを確認することです。オリジナルのPHPでのセッション変数のチェック方法は以下の通りです
isset($_SESSION[‘name']);
ThinkPHPが包装した後、session()関数を使用してチェックする方法は以下の通りです
session(‘?name'); //セッションが既に設定されているかどうかを判定
$name = substr($name,1); if(strpos($name,'.')){ // 配列をサポート リスト($name1,$name2) = explode('.',$name); return $prefix?isset($_SESSION[$prefix][$name1[$name2]:isset($_SESSION[$name1[$name2]); }else{ return $prefix?isset($_SESSION[$prefix][$name]):isset($_SESSION[$name]); }
以下は、session()関数の各機能の使用方法の紹介と、ThinkPHPがどのように実現しているかの概要です。本文の内容がThinkPHPを使用する際の助けになることを願っています。
声明:本文の内容はインターネットから取得しており、著作権者に帰属します。インターネットユーザーにより自発的に貢献し、自己でアップロードされた内容であり、本サイトは所有権を有しておらず、人工的な編集は行われていません。著作権侵害を疑う内容があれば、メールを送信して:notice#oldtoolbag.com(メールを送信する際には、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認がとりたいとされると、本サイトは即座に侵害を疑われるコンテンツを削除します。)