PHP를 사용하여 웹 응용 프로그램을 개발할 때 Session_Register_Shutdown () 함수가 예상대로 작동하지 않을 수 있습니다. 이 기능을 사용할 때 많은 개발자가 혼란스러워 하며이 기사는이 문제의 근본 원인을 탐색하고 해당 솔루션을 제공합니다.
session_register_shutdown ()은 스크립트 실행이 종료 될 때 SESSION_WRITE_CLOSE ()를 자동으로 호출하는 PHP의 세션 관리 기능입니다. 이 기능의 주요 기능은 특히 exit () 또는 예외를 통해 스크립트가 중단 될 수있는 경우 세션 데이터가 올바르게 저장되도록하는 것입니다.
정상적인 상황에서는 PHP 스크립트가 실행되면 Session_Write_Close ()가 자동으로 호출되어 세션 데이터를 저장합니다. 그러나 스크립트의 조기 종료와 같은 일부 특별한 경우에는 세션이 올바르게 작성되지 않을 수 있습니다. 현재 Session_Register_Shutdown ()을 사용하면 스크립트가 비정상적으로 종료 되더라도 세션 데이터가 제대로 저장되도록 할 수 있습니다.
많은 개발자들은 session_register_shutdown () 이 호출 되더라도 세션 데이터가 여전히 저장되지 않았다고보고합니다. 이것은 일반적으로 몇 가지 이유로 인해 발생합니다.
session_register_shutdown ()은 session_start () 이후에 호출되어야합니다. 세션 _start () 전에 호출하면 세션 쓰기 단계에서 등록 된 콜백 함수가 실행되지 않습니다.
예 : 잘못된 통화 순서
session_register_shutdown(); // 실수
session_start();
$_SESSION['user'] = 'admin';
전화하는 올바른 방법
session_start();
session_register_shutdown();
$_SESSION['user'] = 'admin';
스크립트에서 Session_Write_Close ()를 수동으로 호출하면 세션이 닫히고 Session_Register_Shutdown () 등록에 영향을 미치지 않습니다.
session_start();
session_write_close();
session_register_shutdown(); // 유효하지 않은
일부 프레임 워크 또는 사용자 정의 오류 처리 메커니즘은 OB_END_CLEAN () 또는 exit ()을 호출하여 셧다운 콜백이 실행되기 전에 세션이 만료됩니다.
Session_Register_Shutdown () 가 작동하는지 확인하려면 다음 사항을 따를 수 있습니다.
session_start () 직후 항상 session_register_shutdown ()을 호출하십시오.
스크립트에서 Session_Write_Close ()를 미리 호출하지 마십시오.
exit () 또는 die ()를 사용하여 스크립트 실행이 미리 방해받지 않도록하십시오.
버퍼링 메커니즘을 사용하는 경우 셧다운 단계 전에 버퍼링 내용이 지워지지 않도록하십시오.
Session_Register_Shutdown () 의 최상의 사용 사례는 스크립트가 언제 멈출 지 확실하지 않다는 것입니다.
session_start();
session_register_shutdown();
try {
// 예외를 던질 수있는 일부 작업
some_risky_operation();
$_SESSION['status'] = 'success';
} catch (Exception $e) {
$_SESSION['status'] = 'fail';
// 예외 처리 로직
}
이 모드는 예외가 발생하더라도 세션 데이터가 여전히 작성되도록합니다.
디버깅 중에 다음 방법을 사용하여 세션 파일이 올바르게 작성되었는지 확인할 수 있습니다.
echo session_save_path(); // 확인하다 session 파일 경로
그런 다음 서버의 세션 폴더를 수동으로보고 쓰기 지연인지 고장인지 확인할 수 있습니다. 또한 종료 실행 상태를 기록하여 진단을 도울 수도 있습니다.
register_shutdown_function(function () {
error_log("Shutdown executed");
});
session_register_shutdown () 은 유용한 도구이지만 전능 한 것은 아닙니다. 그 효과를 극대화하려면 통화 타이밍과 스크립트 구조의 합리적인 배열에주의를 기울여야합니다. 개발 중에 세션 데이터 손실을 만나면 이러한 주요 포인트를주의 깊게 확인하거나보다 명백한 메커니즘을 사용하여 세션 라이프 사이클을 수동으로 관리 할 수 있습니다.