세션 처리 session_set_save_handler

(PHP 4, PHP 5, PHP 7, PHP 8)

session_set_save_handler — 사용자 수준 세션 저장 함수 설정


설명

session_set_save_handler(
    callable $open,
    callable $close,
    callable $read,
    callable $write,
    callable $destroy,
    callable $gc,
    callable $create_sid = ?,
    callable $validate_sid = ?,
    callable $update_timestamp = ?
): bool
                

다음 프로토타입을 등록할 수 있습니다.

session_set_save_handler(object $sessionhandler, bool $register_shutdown = true): bool

session_set_save_handler()는 세션과 관련된 데이터를 저장하고 검색하는 데 사용되는 사용자 수준 세션 저장 함수를 설정합니다. 이것은 PHP 세션에서 제공하는 것과 다른 저장 메서드를 선호할 때 가장 유용합니다. 세션 데이터를 로컬 데이터베이스에 저장합니다.


매개변수

이 함수에는 두 개의 프로토타입이 있습니다.

sessionhandler
세션 핸들러로 등록할 SessionHandlerInterface 및 선택적으로 SessionIdInterface 및/또는 SessionUpdateTimestampHandlerInterface(예: SessionHandler)를 구현하는 클래스의 인스턴스입니다.
register_shutdown
session_write_close()register_shutdown_function() 함수로 등록합니다.

또는

open
다음 서명이 있는 호출 가능:

open(string $savePath, string $sessionName): bool

열기 콜백은 클래스의 생성자처럼 작동하며 세션이 열릴 때 실행됩니다. session_start()로 세션이 자동 또는 수동으로 시작될 때 가장 먼저 실행되는 콜백 함수입니다. 반환 값은 성공하면 true이고 실패하면 false입니다.

close
다음 서명이 있는 호출 가능:

close(): bool

close 콜백은 클래스에서 소멸자처럼 작동하며 세션 쓰기 콜백이 호출된 후에 실행됩니다. session_write_close()가 호출될 때도 호출됩니다. 반환 값은 성공의 경우 true, 실패의 경우 false여야 합니다.

read
다음 서명이 있는 호출 가능:

read(string $sessionId): string

read 콜백은 항상 세션 인코딩(직렬화된) 문자열을 반환하거나 읽을 데이터가 없는 경우 빈 문자열을 반환해야 합니다.

이 콜백은 세션이 시작되거나 session_start()가 호출될 때 PHP에서 내부적으로 호출됩니다. 이 콜백이 호출되기 전에 PHP는 open 콜백을 호출합니다.

이 콜백이 반환하는 값은 원래 write 콜백에 저장하기 위해 전달된 것과 정확히 동일한 직렬화된 형식이어야 합니다. 반환된 값은 PHP에 의해 자동으로 직렬화 해제되고 $_SESSION 슈퍼글로벌을 채우는 데 사용됩니다. 데이터가 serialize()와 비슷해 보이지만 session.serialize_handler ini 설정에 지정된 다른 형식입니다.

write
다음 서명이 있는 호출 가능:

write(string $sessionId, string $data): string

write 콜백은 세션을 저장하고 닫아야 할 때 호출됩니다. 이 콜백은 직렬화된 버전인 $_SESSION 슈퍼글로벌인 현재 세션 ID를 수신합니다. PHP에서 내부적으로 사용하는 직렬화 메서드는 session.serialize_handler ini 설정에 지정됩니다.

이 콜백에 전달된 직렬화된 세션 데이터는 전달된 세션 ID에 대해 저장되어야 합니다. 이 데이터를 검색할 때 read 콜백은 원래 write 콜백에 전달된 정확한 값을 반환해야 합니다.

이 콜백은 PHP가 종료될 때 또는 session_write_close()가 호출될 때 명시적으로 호출됩니다. 이 함수를 실행한 후 PHP는 내부적으로 close 콜백을 실행합니다.

메모: "write" 핸들러는 출력 스트림이 닫힐 때까지 실행되지 않습니다. 따라서 "write" 핸들러의 디버깅 문의 출력은 브라우저에서 절대 볼 수 없습니다. 디버깅 출력이 필요한 경우 디버그 출력을 대신 파일에 쓰는 것이 좋습니다.

destroy
다음 서명이 있는 호출 가능:

destroy(string $sessionId): bool

이 콜백은 세션이 소멸 매개변수가 true로 설정된 session_destroy() 또는 session_regenerate_id()로 세션이 소멸될 때 실행됩니다. 반환 값은 성공의 경우 true, 실패의 경우 false여야 합니다.

gc
다음 서명이 있는 호출 가능:

gc(int $lifetime): bool

가비지 수집기 콜백은 오래된 세션 데이터를 제거하기 위해 PHP에서 주기적으로 내부적으로 호출됩니다. 빈도는 session.gc_probabilitysession.gc_divisor에 의해 제어됩니다. 이 콜백에 전달되는 수명 값은 session.gc_maxlifetime에서 설정할 수 있습니다. 반환 값은 성공의 경우 true, 실패의 경우 false여야 합니다.

create_sid
다음 서명이 있는 호출 가능:

create_sid(): string

이 콜백은 새 세션 ID가 필요할 때 실행됩니다. 매개변수가 제공되지 않으며 반환 값은 핸들러의 유효한 세션 ID인 문자열이어야 합니다.

validate_sid
다음 서명이 있는 호출 가능:

validate_sid(string $key): bool

이 콜백은 세션이 시작되고 세션 ID가 제공되고 session.use_strict_mode가 활성화될 때 실행됩니다. key는 유효성을 검사할 세션 ID입니다. 해당 ID를 가진 세션이 이미 존재하는 경우 세션 ID는 유효합니다. 반환 값은 성공의 경우 true, 실패의 경우 false여야 합니다.

update_timestamp
다음 서명이 있는 호출 가능:

update_timestamp(string $key, string $val): bool

이 콜백은 세션이 업데이트될 때 실행됩니다. key는 세션 ID이고 val은 세션 데이터입니다. 반환 값은 성공의 경우 true, 실패의 경우 false여야 합니다.


반환 값

성공하면 true를, 실패하면 false를 반환합니다.


Examples

예제 #1 사용자 정의 세션 핸들러: SessionHandlerInterface 개요에서 전체 코드를 참조하십시오.

여기에서 호출을 보여줍니다. 전체 예제는 위에 링크된 SessionHandlerInterface 시놉시스에서 볼 수 있습니다.

session_set_save_handler()와 함께 OOP 프로토타입을 사용하고 함수의 매개변수 플래그를 사용하여 종료 함수를 등록합니다. 이것은 일반적으로 객체를 세션 저장 핸들러로 등록할 때 권장됩니다.

                  
<?php
class MySessionHandler implements SessionHandlerInterface
{
    // implement interfaces here
}

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

// proceed to set and retrieve values by key from $_SESSION
                  
                

메모

경고 writeclose 처리기는 개체 소멸 후에 호출되므로 개체를 사용하거나 예외를 throw할 수 없습니다. 예외는 포착되지 않으며 예외 추적도 표시되지 않고 실행이 예기치 않게 중단되므로 예외를 포착할 수 없습니다. 그러나 객체 소멸자는 세션을 사용할 수 있습니다.

이 닭과 달걀 문제를 해결하기 위해 소멸자에서 session_write_close()를 호출하는 것이 가능하지만 가장 안정적인 방법은 위에서 설명한 대로 종료 함수를 등록하는 것입니다.

경고 스크립트 종료 시 세션이 닫히면 현재 작업 디렉토리가 일부 SAPI로 변경됩니다. session_write_close()를 사용하여 세션을 더 일찍 닫을 수 있습니다.


기타