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

ThinkPHP의 session 함수 상세 설명

PHP에서는 $_SESSION을 사용하여 session을操作하며, ThinkPHP는 session() 함수를 제공합니다. 단 하나의 함수로 session의 추가, 제거, 변경, 검색 기능을 모두 구현합니다. 아래에서는 이 함수의 사용과 구현을 각각 설명합니다.

session() 함수의 정의는 Common에 있습니다./functions.php에서 정의됩니다.

session 설정

session($name='',$value='') 함수는 두 가지 매개변수를 가지며, $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);
  }
  if(isset($name['name']))   session_name($name['name']);
  if(isset($name['path']))   session_save_path($name['path']);
  if(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 두 가지 데이터베이스를 제공합니다.当然了, 기본적으로는 파일 저장을 사용합니다. 세션 저장 방식을 판단하는 코드는 다음과 같습니다:

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 저장 시스템의 구성은 설정 옵션 SESSION_TYPE를 통해 설정됩니다.

SESSION_TYPE=>'Mysql'  //session을 mysql 데이터베이스에 저장합니다

설정이 완료된 후 session 자동 시작이 설정되면 시스템이 자동으로 session을 시작합니다

// session 시작
if(C('SESSION_AUTO_START')) session_start();

session 자동 시작을关闭하려면, 옵션 SESSION_AUTO_START를 다음과 같이 설정합니다:

SESSION_AUTO_START => false

시스템 자동 시작을关闭한 경우, 프로젝트의 공용 파일이나 컨트롤러에서 session_start()를 수동으로 호출하여 session을 시작할 수 있습니다. 또는 함수 session()를 사용하여 시작 방법은 다음과 같습니다:

session(‘[start]’);

ThinkPHP에서의 구현 코드는 다음과 같습니다:

if('[pause]'==$name){ // session 일시 중지
   session_write_close();
}elseif('[start]'==$name){ // session 시작
   session_start();
}elseif('[destroy]'==$name){ // session을 소멸시키기
   $_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에서 session 값 설정의 구현 코드는 다음과 같습니다:

if(strpos($name,'.')){
     list($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;
     }
}

prefix는 옵션 SESSION_PREFIX를 통해 설정됩니다.

session 값을 가져오기

session 값을 가져오는 것은 상대적으로 간단합니다.

먼저 전체 session을 가져오는 방법은 다음과 같습니다.

$values = session();

이 경우 배열을 얻습니다. ThinkPHP에서의 구현 코드는 다음과 같습니다:

if(''===$name){
  // 전체 session을 가져오기
  return $prefix ? $_SESSION[$prefix] : $_SESSION;
}

그리고 단일 값을 꺼내는 것도 있습니다

$value1 = session('name');
//또는
$value2 = session('name1.name2');

구현 코드는 다음과 같습니다:

if(strpos($name,'.')){
   list($name1,$name2) = explode('.',$name);
   return isset($_SESSION[$name1[$name2])?$_SESSION[$name1[$name2:null; 
}else{
   return isset($_SESSION[$name])?$_SESSION[$name]:null;
}

session 지우기

session의 지우기는 session을 비우기, session을 소멸시키기 및 단일 session 값을 지우기로 나뉩니다.

먼저 session을 비우는 것에 대해 설명하겠습니다. session을 비우기는 $name에 null 값을 전달합니다

session(null); //session을 비우기

구현 코드는 다음과 같습니다:

if(is_null($name)){ // session을 비우기
   if($prefix) {
    unset($_SESSION[$prefix]);
   }else{
    $_SESSION = array();
   }
}

session을 비우는 것은 session에 해당하는 파일이나 테이블의 데이터를 지우지만 파일은 존재할 것입니다.

session을 소멸시키기

session('[destroy]');

ThinkPHP에서의 구현 코드는 다음과 같습니다:

if('[destroy]'==$name){ // session을 소멸시키기
   $_SESSION = array();
   session_unset();
   session_destroy();
}

session을 소멸시키는 것과 session을 비우는 것의 차이는 소멸시키는 것이 파일을 모두 소멸시키는 것입니다.

마지막으로 단일 session 값을 지우는 방법은 다음과 같습니다.

session('name',null);

단일 session 값을 지우기 위해 두 번째 매개변수 $value의 값을 null로 설정하면 됩니다.

if(is_null($value)){ // session을 지우기
  if(strpos($name,'.')){
    list($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]);
    }
  }
}

session 확인

마지막으로 session의 확인에 대해 간단히 설명합니다. 확인은 변수가 존재하는지 확인하는 것입니다. 원시적인 PHP는 session 변수를 확인하는 방식은 다음과 같습니다

isset($_SESSION[‘name']);

ThinkPHP가 포장한 후 session() 함수를 사용하여 이렇게 확인합니다

session(‘?name'); //session이 이미 설정되었는지 확인합니다

그 코드 구현도 원시적인 검사 방식을 사용합니다

$name = substr($name,1);
if(strpos($name,'.')){ // 지원 배열
   list($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#w로 이메일을 보내 주세요.3codebox.com(보내는 이메일에서 #을 @으로 변경하십시오. 신고하고 관련 증거를 제공하시면, 사이트가 의심스러운 저작권 내용을 즉시 삭제합니다。)

추천해드립니다