PHP에서 Session_start () 와 세션을 시작한 후 일반적으로 세션 데이터를 저장하기 위해 Session_Write_Close ()를 명시 적으로 호출 할 필요가 없습니다. 스크립트가 중간에 종료되거나 실행을 종료하더라도 PHP는 데이터를 $ _session 에 자동으로 저장합니다. 이 "자동 구매"메커니즘 뒤에는 실제로 매우 중요한 등록 메커니즘 인 Session_Register_Shutdown () 에 의존합니다.
이 기사는 Session_register_Shutdown () 기능의 작동 방식과 PHP 수명주기에서의 역할을 깊이 분석하여 PHP의 세션 자동 저장 프로세스를보다 명확하게 이해할 수 있도록 도와줍니다.
session_register_shutdown () 은 PHP에서 제공하는 함수이며 세션이 시작된 후 종료 함수를 등록하는 데 사용됩니다. 이 기능은 스크립트가 실행 (또는 중단)되면 자동으로 호출되며 현재 세션 데이터를 저장하는 데 사용됩니다. 핵심 기능은 스크립트가 비정상적으로 종료 되더라도 $ _session 의 데이터를 계속 유지할 수 있도록하는 것입니다.
동등하게, 우리는 또한 다음과 같이 이해할 수 있습니다.
session_register_shutdown();
// 동등합니다:
register_shutdown_function('session_write_close');
다시 말해, 내부 세션_register_shutdown ()은 실제로 register_shutdown_function ( 'session_write_close') 의 동작을 캡슐화합니다.
기본적으로 Session_Start ()을 호출하여 세션을 시작하면 PHP는 SESSION_REGISTER_SHUTDOWN ()를 자동으로 등록합니다. 간단한 예를 살펴 보겠습니다.
session_start();
$_SESSION['user'] = 'admin';
exit;
Exit이 Midway로 호출되고 스크립트가 Session_Write_Close ()를 수동으로 호출하지 않더라도 사용자 = 관리자 정보는 세션 파일에 성공적으로 기록됩니다. 이는 Session_Register_Shutdown () 에 의해 등록 된 함수가 종료 단계에서 실행되기 때문입니다.
PHP는 스크립트가 실행될 때 콜백을 등록하기 위해 register_shutdown_function ()을 제공합니다. 이 콜백은 다음 상황에서 실행됩니다.
스크립트는 정상적으로 실행되었습니다
스크립트에서 exit () 또는 die ()를 호출하십시오
스크립트에서 치명적인 오류가 발생했습니다 (예 : 상황에 따라 메모리 소진 등)
PHP의 종료 프로세스는 대략 다음과 같습니다.
모든 스크립트 로직이 실행되었습니다
등록 된 셧다운 함수 실행 ( session_write_close 포함)
변수 파괴, 자원 방출 등과 같은 정리 작업
클라이언트에 대한 콘텐츠를 출력합니다
따라서이 단계에서 Session_Register_Shutdown () 에 의해 등록 된 함수가 호출되어 모든 종료 모드에서 세션 데이터를 올바르게 저장할 수 있도록합니다.
PHP의 소스 코드 구현에서 Session_Register_Shutdown ()은 실제로 Session_Write_Close ()를 종료 콜백으로 등록합니다. 핵심 논리는 Ext/Session/Session.c에서 찾을 수 있습니다.
PHP_FUNCTION(session_register_shutdown)
{
php_session_register_shutdown();
}
및 php_session_register_shutdown ()는 다음과 같이 호출합니다.
register_shutdown_function("session_write_close", NULL);
따라서 본질은 세션을 자동으로 저장하는 작업 기능을 등록하고 수동으로 작성하는 것입니다.
register_shutdown_function('session_write_close');
완전히 동일합니다.
PHP는 자동으로 Session_Write_Close ()를 호출하지만 일부 시나리오에서 수동으로 호출하는 것은 최적화 방법입니다. 예를 들어:
미리 잠금을 해제하십시오 : PHP의 세션은 파일 잠금을 기반으로합니다. Session_write_close ()을 호출하지 않으면 스크립트가 끝날 때까지 세션 파일이 잠겨있어서 다른 요청을 차단할 수 있습니다.
동시 요청 : 세션을 운영해야하지만 서로 의존하지 않는 여러 동시 요청이있는 경우 $ _session을 읽은 후 즉시 Session_Write_Close ()를 읽고 잠금을 해제하여 동시성을 향상시킬 수 있습니다.
성능 향상 : 장기 실행 스크립트에서 가능한 한 빨리 세션을 출시하면 불필요한 자원 소비를 피할 수 있습니다.
예:
session_start();
$user = $_SESSION['user'];
session_write_close(); // 잠금 장치를 미리 해제하십시오
// 후속 논리는 영향을 미치지 않습니다 session 데이터
file_get_contents('https://m66.net/api/do-something');
PHP 세션 뒤에는 SESSION_REGISTER_SHUTDOWN () 함수를 통해 자동 저장 메커니즘이 구현됩니다. 스크립트가 끝나기 전에 SESSION_WRITE_CLOSE ()를 자동으로 호출하기 위해 종료 함수를 등록하여 세션 데이터가 올바르게 저장되도록합니다.
이 메커니즘을 이해하면보다 강력한 코드를 작성하는 데 도움이 될뿐만 아니라 성능 최적화 (예 : 높은 동시성 환경)에서 효과적인 솔루션을 제공합니다. 이러한 근본적인 세부 사항을 마스터하는 데 능숙한 것은 모든 선임 PHP 개발자에게 중요한 재배입니다.