>  기사  >  백엔드 개발  >  PHP의 세션을 이해하고 세션 유효 기간_php 기술을 제어합니다.

PHP의 세션을 이해하고 세션 유효 기간_php 기술을 제어합니다.

WBOY
WBOY원래의
2016-05-16 20:00:32960검색

0. 세션이란 무엇인가요?
세션의 중국어 번역은 "대화"라고 합니다. 원래 의미는 시작과 끝이 있는 일련의 작업/메시지를 의미합니다. 전화 걸기부터 전화 끊기까지를 세션이라고 부를 수 있습니다. 현재 사회에서 세션에 대한 이해는 매우 혼란스럽습니다. 때때로 "브라우저 세션 중..."이라는 단어를 볼 수 있습니다. 여기서 세션은 브라우저 창이 열리는 시점부터 닫힐 때까지의 기간을 의미합니다. "세션 중 사용자(클라이언트)"라는 문장을 참조하면, 사용자의 일련의 행위(보통 로그인부터 상품 구매, 결제까지 특정 목적과 관련된 일련의 행위)를 의미할 수 있습니다. 그러나 이러한 온라인 쇼핑 과정은 때로는 연결만을 의미할 수도 있습니다.
문맥을 통해서만 차이점을 추론할 수 있습니다. 그러나 세션이라는 단어가 네트워크 프로토콜과 연관되는 경우 이는 종종 "연결 지향" 및/또는 "상태 유지"라는 두 가지 의미를 의미합니다. "연결 지향"은 통신 당사자가 통신하기 전에 먼저 연결을 설정해야 함을 의미합니다. .전화 통화 등의 통신 채널은 상대방이 전화를 받을 때까지 시작할 수 없습니다. "상태 유지"는 통신 당사자가 메시지가 서로 의존할 수 있도록 일련의 메시지를 연관시킬 수 있음을 의미합니다. 예를 들어 웨이터는 다시 오는 오래된 고객을 인식하고 고객이 지난번에 매장에 1달러를 빚졌음을 기억할 수 있습니다. . 이 범주의 예로는 "TCP 세션" 또는 "POP3 세션"이 있습니다.
이러한 혼란은 되돌릴 수 없다는 점에서 세션을 정의하는 통일된 표준을 마련하는 것은 어렵습니다. 세션 관련 정보를 읽을 때 우리는 이해를 추론하기 위해 맥락에만 의존할 수 있습니다. 하지만 다음과 같이 이해할 수 있습니다. 예를 들어 전화를 걸 때 전화를 거는 순간부터 전화를 끊는 순간까지 전화는 계속 연결되어 있으므로 이 연결 상태를 세션이라고 합니다. 방문자와 전체 웹 사이트 간의 상호 작용 중에 항상 존재하는 공개 변수입니다. 클라이언트가 COOKIE를 지원하지 않는 경우 데이터가 정확하고 안전한지 확인하기 위해 SESSION 변수가 사용됩니다. 웹사이트 방문자에게는 소위 세션 ID라는 고유 식별자가 할당됩니다. 이는 클라이언트측 쿠키에 저장되거나 URL을 통해 전달됩니다.
SESSION의 발명은 HTTP 프로토콜의 한계를 채웠습니다. HTTP 프로토콜은 상태 비저장 프로토콜로 간주되며 사용자의 탐색 상태를 알 수 없습니다. 서버 측에서 응답이 완료되면 서버와 브라우저의 연결이 끊어집니다. 이는 HTTP 프로토콜의 원래 목적과 일치합니다. 클라이언트와 서버는 서로의 과거 동작을 기록할 필요가 없습니다. 고객과 자판기 또는 일반(비회원) 대형마트.
따라서, 이용자의 관련 정보는 SESSION(쿠키도 다른 솔루션)을 통해 기록되어 이용자가 이 아이디로 다시 웹서버에 요청 시 확인할 수 있도록 합니다. 세션의 발명을 통해 사용자는 여러 페이지 사이를 전환할 때 자신의 정보를 보존할 수 있습니다. 웹사이트 프로그래머라면 누구나 이런 경험이 있을 것입니다. 각 페이지의 변수는 다음 페이지에서 사용할 수 없는 반면(form과 url도 구현할 수 있지만 이는 매우 만족스럽지 못한 방법입니다), SESSION에 등록된 변수는 전역 변수로 사용할 수 있습니다. 변하기 쉬운.
​ ​ 그럼 SESSION의 용도는 무엇일까요? 누구나 온라인 쇼핑을 할 때 장바구니를 사용해 본 적이 있을 것입니다. 언제든지 선택한 제품을 장바구니에 추가하고 마지막으로 결제 카운터로 가서 결제할 수 있습니다. 전체 과정에서 장바구니는 선택한 상품을 임시로 보관하는 역할을 담당해 왔으며, 이는 웹사이트에서 사용자의 활동을 추적하는 데 사용되며 이는 사용자 신원 인증, 프로그램 상태 등에 사용될 수 있습니다. 녹음, 페이지 간 매개변수 전달 등
COOKIE 기술은 SESSION 구현에 사용됩니다. SESSION은 클라이언트 측에 session_id(SESSION 번호)를 포함하는 COOKIE를 저장하고, session_name 등과 같은 다른 세션 변수는 서버 측에 저장됩니다. 사용자가 서버에 요청하면 session_id도 서버로 전송됩니다. session_id를 통해 서버측에 저장된 변수를 추출하면 사용자가 누구인지 식별할 수 있습니다. 동시에 SESSION이 때때로 실패하는 이유를 이해하는 것은 어렵지 않습니다.
클라이언트가 COOKIE를 비활성화한 경우(IE에서 "도구" - "인터넷="">인터넷 옵션" 클릭, 팝업 대화상자에서 "보안" - "사용자 정의 수준" 항목 클릭 후 "각 대화 허용" COOKIE 변경) "가 비활성화로 설정되어 있으면 session_id가 전달되지 않으며 현재 SESSION은 유효하지 않습니다. 그러나 php5는 Linux/Unix 플랫폼에서 쿠키 상태를 자동으로 확인할 수 있습니다. 클라이언트가 비활성화된 경우 시스템은 자동으로 session_id를 URL에 추가하고 이를 전달합니다. Windows 호스트에는 이 기능이 없습니다. 

1.php 세션 유효기간

PHP의 기본 세션 유효 기간은 1440초(24분)입니다. 클라이언트가 24분 이상 새로 고치지 않으면 현재 세션이 재활용되어 무효화됩니다.
사용자가 브라우저를 닫으면 세션이 종료되고 세션이 무효화됩니다.

php.ini에서 session.gc_maxlifetime을 수정하여 세션 수명 주기를 설정할 수 있지만, 이 시간이 초과되면 세션 정보가 즉시 삭제된다는 보장은 없습니다. 확률에 따라 GC가 시작되기 때문에 오랜 시간 동안 GC가 시작되지 않을 수 있습니다. 그러면 session.gc_maxlifetime을 초과한 후에도 많은 수의 세션이 여전히 유효합니다.


2.session.gc_maxlifetime,session.gc_probability,session.gc_divisor 설명

session.gc_maxlifetime = 30은 30초 후에도 세션 파일에 액세스하지 않으면 만료된 세션으로 간주되어 GC 재활용을 기다리고 있음을 의미합니다.

GC 프로세스 호출 확률은 session.gc_probability/session.gc_divisor를 통해 계산되며, session.gc_divisor의 기본값은 1000입니다.
session.gc_probability = 1000이면 session_start()가 실행될 때마다 GC 프로세스가 호출되어 재활용을 수행합니다.

session.gc_probability/session.gc_divisor의 확률을 높이면 도움이 되지만 성능에 심각한 영향을 미치게 됩니다.


3. 세션 만료 방법을 엄격하게 제어합니다

(1) memcache/redis를 사용하여 세션을 저장하고 만료 시간을 설정하세요. memcache/redis의 재활용 메커니즘은 확률을 기반으로 하지 않기 때문에 만료 후 세션이 무효화되도록 할 수 있습니다.

(2) PHP만 사용하여 구현하고, 세션 클래스를 생성하고, 세션 작성 시 만료 시간을 작성합니다. 읽을 때 만료 시간을 기준으로 만료 여부를 확인하십시오.

<&#63;php
/**
 * Session控制类
 */
class Session{

  /**
   * 设置session
   * @param String $name  session name
   * @param Mixed $data  session data
   * @param Int  $expire 超时时间(秒)
   */
  public static function set($name, $data, $expire=600){
    $session_data = array();
    $session_data['data'] = $data;
    $session_data['expire'] = time()+$expire;
    $_SESSION[$name] = $session_data;
  }

  /**
   * 读取session
   * @param String $name session name
   * @return Mixed
   */
  public static function get($name){
    if(isset($_SESSION[$name])){
      if($_SESSION[$name]['expire']>time()){
        return $_SESSION[$name]['data'];
      }else{
        self::clear($name);
      }
    }
    return false;
  }

  /**
   * 清除session
   * @param String $name session name
   */
  private static function clear($name){
    unset($_SESSION[$name]);
  }

}
&#63;>

데모:

<&#63;php
session_start();

$data = '123456';
session::set('test', $data, 10);
echo session::get('test'); // 未过期,输出
sleep(10);
echo session::get('test'); // 已过期
&#63;>

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.