PHP 세션 제어: 쿠키와 세션 간의 차이점과 사용법에 대한 심층적인 이해

齐天大圣
풀어 주다: 2023-04-08 15:58:01
원래의
2319명이 탐색했습니다.

세션 제어에 관해 말하면 대부분의 사람들은 간단하지 않다고 생각할 것입니다. 그냥 COOKIE와 SESSION 아닌가요?

쿠키와 세션인데, 실제로 어떻게 사용하는지 알고 계시나요?

몇 년 전 인터뷰에서 다음과 같은 질문을 받았습니다.

세션이 1시간 후에 만료되도록 하는 방법은 무엇입니까?

당시에는 gc_maxlifetime을 3600으로 설정하는 것이 간단하지 않다고 생각했습니다. 당시 면접관은 답변이 틀렸으며, 1시간이 지나면 무효가 된다는 보장이 없다고 말했다. 물론 그 사람은 나에게 이유를 알려주지 않았다. 나중에 돌아와서 꼼꼼히 검색해서 알아냈어요.

이 질문에 대답하기 전에 쿠키와 세션에 대한 지식을 대중화합시다.

COOKIE와 SESSION의 차이점과 연결

저장 위치의 차이:

  • 쿠키는 클라이언트 측에 저장됩니다

  • 세션은 서버 측에 저장됩니다

사이의 연결 them:

서버가 세션을 열면, 즉

session_start();
로그인 후 복사

이후 고유 ID(session_id)를 생성하고 응답 헤더를 통해 클라이언트에 알립니다. 클라이언트가 이를 얻은 후에는 쿠키에 저장됩니다. 클라이언트가 요청을 다시 시작하면 이 정보를 가져옵니다. 이 정보를 받은 후 서버는 세션 파일이 저장된 디렉터리로 이동하여 해당 파일을 찾고, 찾은 후 세션 정보를 추출합니다. 서버는 이 메커니즘을 통해 클라이언트의 신원을 식별합니다.

그러므로 쿠키가 없으면 세션은 의미가 없습니다.

쿠키와 세션의 관계를 소개한 후, 세션의 유효기간에 대해 이야기해보겠습니다.

SESSION의 가비지 수집

일반적으로 PHP의 기본 세션 유효 기간은 24분입니다. 클라이언트가 이 시간을 초과한 후에도 요청을 발행하지 않으면 가비지 수집 메커니즘을 트리거하고 만료된 세션 파일을 삭제할 수 있습니다. 왜 가능합니까? 이것은 쓰레기 메커니즘의 원리에 관한 것입니다.

PHP의 세션 가비지 수집은 확률적이며 확률은 session.gc_probability 및 session.gc_diviso에 의해 결정됩니다. 확률은

session.gc_probability/session.gc_diviso
로그인 후 복사

php의 기본 gc_probability는 1이고, gc_diviso의 기본값은 100입니다. 즉, 각 요청에 대해 가비지 수집이 실행될 확률은 1/100입니다. 일반적으로 당사 웹 사이트의 방문 수가 많은 경우 이 확률을 1/1000과 같이 높여서 IO 작업을 줄일 수 있습니다.

또 한 가지 주의할 점이 있습니다. 예를 들어 클라이언트 A는 이때 새 세션을 생성했습니다(세션은 10분 동안 유효함). 8분 후 A가 다른 요청을 보냈습니다. 이때 그의 세션이 2분 후에 만료됩니까, 아니면 10분 후에 만료됩니까?

답변은 10분 안에 입니다. 두 번째 요청 이후에는 서버 측 세션 파일의 수정 시간도 변경되었기 때문입니다. 가비지 수집은 세션 파일의 마지막 수정 시간을 살펴봅니다. 하지만 다시 생각해 보세요. 해당 쿠키 유효 기간도 업데이트되나요? 아쉽게도 쿠키 유효 기간은 업데이트되지 않습니다.

세션 파일이 1시간 안에 확실히 만료되도록 하는 방법

이제 원래 질문인 세션 파일이 1시간 안에 확실히 만료되도록 하는 방법을 살펴보겠습니다. 세션 가비지 수집은 확률적 이벤트이므로 기대할 수 없습니다.

그러면 쿠키의 유효기간을 설정하고, cookie_lifetime을 설정하면 되나요?

대답은 아직 '아니오'입니다. 쿠키가 클라이언트 측에 있습니다. 다음 요청에서는 쿠키를 가져올 수 없지만 해당 세션 파일은 여전히 ​​존재합니다.

사실 이 문제를 해결하는 가장 간단한 방법은 Redis에 세션을 저장하고 Redis 키의 만료 시간을 사용하여 1시간 이내에 만료되도록 하는 것입니다. 이 방법도 추천하는 방법이에요

그런데 PHP만 사용할 수 있다면 어떻게 완성할 수 있을까요?

각 세션마다 타임스탬프를 설정하고 각 액세스 전에 타임스탬프를 결정할 수 있습니다. 코드 붙여넣기:

<?php
session_start([
    &#39;cookie_lifetime&#39; => 3600,
    &#39;gc_maxlifetime&#39; => 3600
]);

if (isset($_SESSION[&#39;lifetime&#39;]) && $_SESSION[&#39;lifetime&#39;] > time()) {
    // 未过期,更新session的lifetime及cookie的有效期
    $_SESSION[&#39;lifetime&#39;] += 3600;
    $tmpVal = $_COOKIE[session_name()];
    setcookie(session_name(), $tmpVal, time() + 3600, &#39;/&#39;);
} else {
    // 过期删除
    $_SESSION = [];
    if (isset($_COOKIE[session_name()])) {
        setcookie(session_name(), &#39;&#39;, time() - 100, &#39;/&#39;);
    }
    session_destroy();
}
로그인 후 복사

이 콘텐츠를 읽은 후에는 모든 사람이 PHP 세션에 대해 더 깊이 이해해야 한다고 믿습니다.

위 내용은 PHP 세션 제어: 쿠키와 세션 간의 차이점과 사용법에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿