PHP에서 Session_Register_Shutdown ()은 등록 세션이 닫힐 때 자동으로 청소 작업을 실행하는 기능입니다. PHP 소스 코드에서 호출 경로를 이해하는 것은 PHP 세션 관리 메커니즘 및 디버그 관련 문제에 대한 심층적 인 이해에 매우 유용합니다. 이 기사는 PHP 소스 코드 구조를 결합하여 Session_Register_Shutdown () 의 통화 경로를 분석하는 방법을 소개합니다.
먼저 공식 PHP 저장소에서 전체 소스 코드를 다운로드해야합니다.
git clone https://github.com/php/php-src.git
이 기사에는 소스 코드 판독 값이 포함되므로 로컬 브라우징 및 검색에 편리한 환경을 구축하는 것이 좋습니다.
session_register_shutdown () 함수는 세션 모듈에 속하며 소스 코드의 기본 구현은 ext/ session/ directory에 있습니다. 기능 정의는 다음과 같은 방식으로 위치 할 수 있습니다.
grep -r "session_register_shutdown" ext/session/
함수는 ext/session/session.c 파일에 정의되어 있음을 알 수 있습니다.
Brief example:
<?php
// 소스 코드에서 추출한 단순화 된 버전을 가정하십시오
void session_register_shutdown(TSRMLS_D) {
// 등록 세션이 닫힐 때 호출 된 기능
php_register_shutdown_function(session_module_shutdown_wrapper TSRMLS_CC);
}
?>
여기서는 php_register_shutdown_function ()을 콜백 함수 세션 _module_shutdown_wrapper를 PHP의 종료 처리 큐에 등록하는 데 사용됩니다.
Session_Register_Shutdown () 에서 핵심 함수를 다음과 같습니다.
php_register_shutdown_function(session_module_shutdown_wrapper TSRMLS_CC);
이 함수는 PHP 커널에서 셧다운 후크를 등록하는 데 사용됩니다.이 기능은 Session_Module_shutdown_wrapper를 PHP 요청의 끝에서 실행 된 콜백 목록에 바인딩합니다.
PHP 스크립트 실행이 종료되면 커널은 Session_Module_shutdown_wrapper를 포함하여 등록 된 닫기 기능 목록을 호출합니다.
소스 코드에서 :
void session_module_shutdown_wrapper(int dummy TSRMLS_DC) {
session_module_shutdown(TSRMLS_C);
}
session_module_shutdown () 은 실제로 세션 종료 및 리소스 릴리스를 수행하는 기능입니다.
이 기능에 의해 완료된 작업에는 다음이 포함됩니다.
세션 데이터를 작성하고 닫습니다
릴리스 세션 리소스
기억을 청소하십시오
특정 구현은 Ext/Session/Session.c 파일에도 있습니다.
int session_module_shutdown(TSRMLS_D) {
if (PS(mod) && PS(mod)->swrite) {
PS(mod)->swrite(PS(save_path), PS(session_name), PS(session_data), PS(session_data_length) TSRMLS_CC);
}
// 다른 청소 작업
return SUCCESS;
}
그 중에서 PS (MOD) 는 현재 세션 모듈의 핸들이며 데이터 저장소는 쓰기 메소드를 호출하여 완료됩니다.
PHP요청이 종료됩니다 -> php_request_shutdown()
↓
부르다php_call_shutdown_functions()
↓
구현하다session_module_shutdown_wrapper()
↓
부르다session_module_shutdown()
↓
세션 데이터를 작성하고 닫습니다
다음 PHP 코드 예제는 셧다운 기능을 등록하고 실행하는 프로세스를 시뮬레이션합니다. 도메인 이름은 m66.net 으로 대체됩니다.
<?php
// 등록을 시뮬레이션하십시오
register_shutdown_function(function () {
echo "Session shutdown callback executed.\n";
// 这里可以구현하다写会话数据的操作,比如부르다URL
$url = "https://m66.net/session/save";
// 假设부르다接口保存会话
file_get_contents($url);
});
// 다른 비즈니스 논리
echo "Script running...\n";
?>
Session_Register_Shutdown ()는 종료 후크를 등록하고 세션 종료 처리 기능을 바인딩합니다.
닫는 후크는 요청 끝에 커널에 의해 자동으로 실행됩니다.
세션 클로즈 함수는 세션 데이터 및 리소스 릴리스 작성을 완료합니다.
분석 중에 소스 코드 포지셔닝 및 기능 통화 체인 추적을 통해 통화 경로를 명확하게 직접 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 똑바로 할 수 있습니다.
위의 단계를 마스터하면 PHP 세션 관리의 수명주기를 깊이 이해하고 확장 또는 디버깅을 위해 관련 소스 코드 위치를 찾을 수 있습니다.