English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

ThinkPHPのsession関数の詳細

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(メールを送信する際には、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認がとりたいとされると、本サイトは即座に侵害を疑われるコンテンツを削除します。)

基本教程
おすすめ