>  기사  >  백엔드 개발  >  PHP의 세션 학습

PHP의 세션 학습

不言
不言원래의
2018-05-07 09:21:021068검색

이 글은 주로 PHP의 세션 학습을 소개합니다. 이제 이를 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

쿠키와 세션은 웹 개발에서 쉽게 혼동되는 두 가지 개념입니다. 두 가지를 모두 이해하면 웹 상호 작용을 더 잘 이해하는 데 도움이 됩니다. 개인적으로 세션과 쿠키의 주요 차이점은 다음과 같다고 생각합니다.

cookie

정보는 클라이언트에 저장됩니다

클라이언트는 구체적인 구현을 담당합니다

데이터의 크기와 양은 일반적으로 Limited

데이터는 쉽게 도용되고 변조됩니다

session

데이터는 서버측에 저장됩니다

서버는 특정 구현을 담당합니다

원칙적으로 데이터의 크기와 수량에는 제한이 없습니다.

높은 보안 및 강력한 신뢰성

좁은 의미의 세션은 웹 세션의 세션 ID 및 관련 데이터를 의미하고, 넓은 의미의 세션은 통신 당사자 간의 대화형 세션을 의미합니다. 예를 들어, 사용자 로그인은 세션 상호작용이고, ATM에서 돈을 인출하는 것은 세션 상호작용입니다.

세션 세부정보

세션의 주요 기능은 세션을 식별하고 세션 중에 데이터를 저장하는 것입니다. 다음은 세션의 일부 세부정보입니다.

Access

PHP는 $_SESSION 슈퍼 전역 변수를 통해 세션의 모든 데이터를 얻고 저장합니다. $_SESSION은 쉽게 할당하고 읽을 수 있는 배열입니다. 예:

$name = $_SESSION['NAME'];  // 读取session中的name值
$_SESSION['NAME'] = 'new name';   // 赋新值
unset($_SESSION['NAME']);     // 移除session中的值

Expiration time

기본 세션의 데이터는 PHP 실행 가비지 여부에 따라 세션 시간이 초과된 후 제거될 수 있습니다. 신속하게 수집합니다. 가비지 수집을 실행하는 PHP의 계수는 요청 수이므로 결과는 다음과 같습니다. 1. 트래픽이 적은 사이트의 세션 데이터는 시간 초과 후에도 오랫동안 제거되지 않습니다. 2. 트래픽이 많은 사이트는 세션 가비지 수집을 자주 수행합니다. 3. 가비지 실행 가비지 수집이 실행되는 사용자는 수집이 사용자의 요청을 실행하기 전에 시스템 지연을 경험할 수 있습니다. 더 나은 해결책은 PHP의 기본 가비지 수집을 비활성화하고 cron 작업을 통해 session_gc 함수를 정기적으로 실행하는 것입니다. 이는 세션의 적시성을 보장할 뿐만 아니라 성능과 사용자 경험도 향상시킵니다.

세션에서 데이터를 수동으로 제거하려면 unset을 사용하여 단일 데이터 항목을 제거하거나 session_destroy 함수를 사용하여 모든 데이터를 강제로 삭제할 수 있습니다.

저장 매체 및 직렬화

세션 내 데이터는 기본적으로 파일 형태로 디스크에 저장되며, 세션이 열리면 파일 내용을 읽고 역직렬화한 후 $_SESSION 배열을 저장합니다. 채우는. 트래픽이 많은 사이트에서는 세션 파일이 저장되는 디렉터리에 작은 파일이 많이 포함되어 파일 시스템에 IO 부담이 커집니다.

세션 모듈의 핸들러는 데이터베이스, redis/memcache 및 기타 미디어에 저장하는 등 데이터 저장 방법을 지정할 수 있습니다. PHP의 내장 핸들러에는 파일(기본값), redis 및 memcache가 포함됩니다. 사용자는 session_set_save_handler를 통해 자신의 핸들러를 등록할 수 있습니다.

세션에 저장되는 데이터는 문자열과 같은 기본 유형일 수도 있고 배열, 객체와 같은 복합 유형일 수도 있습니다. 세션 설정의 serialize_handler는 직렬화 및 역직렬화를 위한 핸들러를 설정하는 데 사용됩니다. 핸들러가 데이터를 직렬화한 후 저장을 위해 save_handler로 전달됩니다. 리소스와 같은 유형은 세션에 저장될 수도 없고 저장되어서도 안 된다는 점을 직렬화를 통해 알 수 있습니다. DB 연결 핸들을 세션에 저장했다가 10분 뒤에 꺼내서 사용한다는 생각은 하루라도 빨리 폐기해야 한다.

세션 설정 이름

http는 상태 비저장 프로토콜이므로 서버가 세션을 구별할 수 있도록 클라이언트는 요청할 때 세션 ID를 가지고 있어야 합니다. 세션 ID를 식별하는 기본 이름은 PHPSESSID입니다. session_name을 사용하여 다른 이름을 설정할 수 있습니다. 예를 들어 공격자가 백엔드가 PHP 언어 시스템이라고 추측하는 것을 방지하기 위해 세션 ID의 이름을 JSESSIONID로 설정하여 공격자를 혼란스럽게 할 수 있습니다.

세션이 자동으로 열립니다.

현재 주류 PHP 버전은 기본적으로 세션을 자동으로 열지 않습니다. 예를 들어 방문자가 페이지를 본 후 떠나는 경우 세션이 자동으로 열리면 사용자가 다음에 방문할 때 식별할 수 있도록 일련의 초기화 작업 후에 세션 ID가 클라이언트로 전송됩니다. 일회성 방문자 또는 시스템에 로그인하지 않은 사용자의 경우 이러한 작업은 추가 오버헤드만 발생시킵니다.

세션을 자동으로 열지 않는 경우의 단점은 세션을 사용하기 전에 세션이 열려 있는지 확인해야 한다는 것입니다. 그렇지 않으면 빈 데이터를 얻을 수 있습니다. 기본 세션 이름이 바뀌면 현재 사용되는 세션 이름을 나타내기 위해 session_start 전에 session_name을 호출해야 합니다.

분산 세션

트래픽이 많은 사이트의 경우 백엔드에 서비스를 제공하는 PHP 서버가 두 개 이상인 경우가 많습니다. 사용자의 여러 요청이 동일한 서버에 전달되지 않고 서버의 세션 데이터가 공유되지 않는 경우 사용자는 반복적으로 로그인해야 할 수 있습니다. 이 문제에 대한 해결 방법은 프런트 엔드에서 요청을 배포하거나 백 엔드에서 분산 공유 세션을 설정하여 수행할 수 있습니다.

세션 데이터를 파일 형식으로 저장하는 시스템에서는 디렉터리를 공유 디렉터리로 지정할 수 있으며, redis/memcache/db 등에 세션을 저장하는 시스템에서는 모든 서버 세션이 이 디렉터리에 저장됩니다. 세션 서버는 세션 공유를 달성할 수 있습니다. 세션 공유로 구축된 시스템에서 프런트 엔드 로드 밸런서는 원하는 대로 모든 서버에 요청을 배포할 수 있습니다.

관련 권장 사항:

PHP 로그인 세션 가져오기

PHP는 다중 서버 SESSION 공유를 실현합니다


위 내용은 PHP의 세션 학습의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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