웹 개발에 PHP를 사용할 때 세션은 우리에게 매우 일반적인 국가 관리 도구입니다. 그러나 $ _session 데이터가 명확하게 설정되었지만 일부 요청 후에 다시 액세스 할 때 손실 된 데이터를 경험 한 적이 있습니까? 또는 session_write_close ()를 호출 한 후에는 데이터가 여전히 예상대로 작성되지 않습니까? 이러한 문제의 근본은 session_register_shutdown () 기능을 잘 사용하거나 이해하지 못했을 가능성이 있습니다.
Session_Register_Shutdown () 은 PHP의 함수로 등록 세션이 콜백을 씁니다. 간단히 말해서, 스크립트가 실행되면 PHP가 자동으로 Session_Write_Close () 를 호출하여 $ _session 데이터를 안전하게 저장하도록하는 것입니다.
"세션을 관리하는 데 도움이되는 프레임 워크가 사용되지 않았습니까?" 실제로, 대부분의 현대 프레임 워크 (Laravel, Symfony 등)는 이미 세션의 수명주기 관리를 바닥에서 캡슐화했지만 일부 기본 PHP 개발 또는 가벼운 프레임 워크에서는이 세부 사항이 쉽게 간과됩니다.
기본적으로 PHP는 스크립트 실행 종료시 세션 데이터를 저장하려고 시도합니다. 그러나 exit () , 중간에 다이 ()을 호출하거나 예외로 인해 스크립트가 일찍 종료되면 세션이 정상적으로 작성되지 않을 수 있습니다. 예를 들어:
session_start();
$_SESSION['user'] = 'Alice';
header('Location: https://m66.net/next-page.php');
exit();
위 코드에서는 exit () 의 존재로 인해 값을 $ _session [ 'user'] 에 할당하지만 session_write_close () 가 Session_Start () 호출 후 명시 적으로 호출되지 않으면 세션 데이터를 디스크 또는 메모리에 성공적으로 작성하지 않을 수 있습니다.
해결책은 다음과 같습니다. Session_Register_Shutdown ()을 사용하여 스크립트 끝에서 세션을 자동으로 닫는 함수를 등록합니다.
session_start();
session_register_shutdown();
$_SESSION['user'] = 'Bob';
header('Location: https://m66.net/profile.php');
exit();
이 줄 Session_Register_Shutdown () 을 통해 스크립트가 중간에서 종료되어 데이터가 손실되지 않도록하더라도 SESSION_WRITE_CLOSE ()를 셧다운 단계에서 session_write_close ()를 실행하도록 PHP에 알려줍니다.
세션을 수동으로 처리 해야하는 경우 조합으로 사용할 수도 있습니다.
function close_session_safely() {
if (session_status() === PHP_SESSION_ACTIVE) {
session_write_close();
}
}
session_start();
session_register_shutdown('close_session_safely');
$_SESSION['authenticated'] = true;
이러한 방식으로, exit () 또는 die ()가 중간에 발생하더라도 치명적인 오류로 인해 스크립트가 중단되지 않는 한 $ _session 데이터를 올바르게 저장할 수 있습니다.
이 기능은 세션 이 시작된 후에 만 사용할 수 있습니다.
session_register_shutdown () 은 PHP 5.4+에서 사용할 수 있지만 일부 관리 환경에서는 비활성화 될 수 있습니다. 사용하기 전에 구성을 확인하는 것이 가장 좋습니다.
많은 세션 데이터가 일관되지 않고 누락 된 버그는 실제로 세션 수명주기를 제대로 관리하지 않아 발생합니다. session_register_shutdown ()을 사용하는 것은 작은 추가 기능이지만 안정성이 크게 향상 될 수 있습니다. 특히 프레임 워크 PHP 응용 프로그램을 개발할 때이 습관을 개발하면 많은 함정을 피할 수 있습니다.
다음에 세션 예외를 디버깅 할 때 셧다운 기능을 등록하는 것을 잊었는지 확인할 수도 있습니다. 결국, 좋은 코드를 작성하면 "실행 가능"할뿐만 아니라 "신뢰할 수있는"도 있습니다.
관련 태그:
session