이번에는 PHP 세션 사례에 대한 자세한 설명을 가져왔습니다. PHP 세션 사용 시 주의사항은 무엇인가요? 실제 사례를 살펴보겠습니다.
쿠키와 세션은 웹 개발 초보자가 쉽게 혼동하는 두 가지 개념입니다. 이 두 가지를 명확히 하면 웹 상호 작용을 더 잘 이해하는 데 도움이 됩니다. 개인적으로 세션과 쿠키의 주요 차이점은 다음과 같다고 생각합니다.
cookie
정보는 클라이언트에 저장됩니다.
구체적인 구현은 클라이언트가 담당합니다.
데이터의 크기와 양은 일반적으로 제한됩니다
데이터는 쉽게 도난당하고 변조됩니다.
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를 통해 자신의 핸들러를 등록할 수 있습니다.
session에 저장된 데이터는 strings과 같은 기본 유형이거나 배열 및 객체와 같은 복잡한 유형일 수 있습니다. 세션 설정의 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+ajax를 사용하여 뉴스 데이터를 얻는 사례에 대한 자세한 설명
php 컬 배치 처리를 통해 제어 가능한 동시 비동기 작업 사례 구현 자세한 설명
위 내용은 PHP 세션 사례에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!