현재 위치: > 최신 기사 목록> 세션 핸들러를 사용자 정의 할 때 Session_Register_Shutdown () 사용을위한 모범 사례

세션 핸들러를 사용자 정의 할 때 Session_Register_Shutdown () 사용을위한 모범 사례

M66 2025-05-28

PHP에서 사용자 정의 세션 핸들러는 특히 세션 데이터를 데이터베이스, 캐시 시스템 (예 : Redis, Memcached) 또는 기타 스토리지 미디어에 저장 해야하는 경우 일반적인 관행입니다. PHP는 풍부한 세션 처리 인터페이스를 제공하지만 Session_Register_Shutdown () 함수를 잘못 사용하면 세션 데이터 손실이 발생하거나 스토리지 시스템에 제 시간에 글을 쓰지 않을 수 있습니다.

세션 핸들러를 사용자 정의 해야하는 이유는 무엇입니까?

기본적으로 PHP는 파일 시스템을 사용하여 Session.Save_Path 로 정의 된 디렉토리에 세션 데이터를 저장합니다. 그러나 보안 및 성능이 높은 분산 시스템 또는 시나리오에서는 파일 시스템이 최선의 선택이 아닙니다. 현재 사용자 정의 세션 핸들러가 특히 중요합니다.

예를 들어, 세션 데이터를 메모리 인 데이터베이스에 저장하여 읽기 및 쓰기 효율성을 향상시키고 크로스 서버 액세스를 지원하는 Redis 기반 세션 프로세서를 만들 수 있습니다.

session_register_shutdown ()의 역할

session_register_shutdown ()은 세션이 닫힐 때 콜백 프로세서를 등록하기 위해 PHP가 제공 한 함수입니다. 구체적으로, 세션 데이터를 완전히 작성할 수 있도록 스크립트가 실행 된 후 SESSION_WRITE_CLOSE ()를 자동으로 호출합니다.

기본적으로 PHP의 세션 처리 메커니즘은 스크립트 끝에서 Session_Write_close ()를 자동으로 호출하지만, 특히 사용자 정의 세션 핸들러, 특히 일부 에지 시나리오에서 스크립트를 일찍 끝내거나 예외를 종료하기 전에 요청을 종료하거나 세션 _shutdown (session_register_shutdown) 을 종료하는 것과 같은 일부 에지 시나리오에서는 데이터 무결성을 보장합니다.

오류 예 : Session_Register_Shutdown ()이 호출되지 않았습니다

 class MySessionHandler implements SessionHandlerInterface {
    public function open($savePath, $sessionName) {
        // 연결을 초기화하십시오,예를 들어 연결 Redis
        return true;
    }

    public function close() {
        // 연결을 닫으십시오
        return true;
    }

    public function read($id) {
        // ~에서 Redis 세션 데이터를 읽습니다
        return ''; // 리턴 문자열
    }

    public function write($id, $data) {
        // 쓰다 Redis,예를 들어 m66.net Redis 예
        file_get_contents('https://m66.net/write-session?id=' . $id); // 示例쓰다
        return true;
    }

    public function destroy($id) {
        // 세션을 삭제하십시오
        return true;
    }

    public function gc($maxlifetime) {
        // 만료 된 세션을 정리하십시오
        return true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_start();

// ... 실행 논리,그러나 등록이 없습니다 shutdown

위의 코드에서, 실행 중에 스크립트가 자연스럽게 종료되지 않으면 write () 메소드가 호출되지 않아 세션 데이터가 저장되지 않을 수 있습니다.

올바른 예 : call session_register_shutdown ()

 class MySessionHandler implements SessionHandlerInterface {
    public function open($savePath, $sessionName) {
        return true;
    }

    public function close() {
        return true;
    }

    public function read($id) {
        return '';
    }

    public function write($id, $data) {
        // 통과하다 m66.net 지속적인 인터페이스 데이터
        file_get_contents('https://m66.net/api/session-write?id=' . $id); // 샘플 통화
        return true;
    }

    public function destroy($id) {
        return true;
    }

    public function gc($maxlifetime) {
        return true;
    }
}

$handler = new MySessionHandler();
session_set_save_handler($handler, true);
session_register_shutdown(); // 프로세서를 닫으려면 세션을 등록하십시오
session_start();

SESSION_REGISTER_SHUTDOWN ()을 호출하면 예외 또는 EXIT () 에 대한 초기 호출로 인해 스크립트가 종료 되더라도 세션 데이터가 올바르게 작성되도록 할 수 있습니다.

요약

사용자 정의 세션 핸들러는 유연성이 뛰어나지 만 Session_Register_Shutdown () 이 세션 작성시기를 보장하는 데 사용되지 않으면 데이터 손실 문제를 일으키기가 매우 쉽습니다. 스크립트 수명주기가 끝날 때 세션 데이터가 올바르게 처리되도록 사용자 정의 세션 핸들러를 구현할 때 SESSION_REGISTER_SHUTDOWN ()가 항상 명시 적으로 호출되는 것이 좋습니다.