현재 위치: > 최신 기사 목록> Session_Register_Shutdown ()을 예기치 않게 쓰지 않거나 등록하지 않도록 방지하는 방법

Session_Register_Shutdown ()을 예기치 않게 쓰지 않거나 등록하지 않도록 방지하는 방법

M66 2025-05-30

PHP에서 Session_Register_Shutdown () 함수는 세션이 닫힐 때 자동으로 실행되는 콜백 함수를 등록하는 데 사용되므로 스크립트가 실행 된 후 세션 데이터를 올바르게 저장하고 닫을 수 있습니다. 그러나 복잡한 프로젝트에서 Session_Register_Shutdown ()은 때때로 실수로 덮어 쓰거나 등록되지 않아 세션 종료 작업이 정상적으로 실행되지 않아 데이터 손실 또는 세션 예외를 초래할 수 있습니다. 이 기사는이 상황을 피하고 세션 폐쇄 작업의 안정적인 실행을 보장하는 방법을 자세히 소개합니다.


1. session_register_shutdown ()의 메커니즘을 이해합니다.

Session_Register_Shutdown ()은 PHP 5.4 후 register_shutdown_function ( 'session_write_close')을 교체하는 권장 방법입니다. 목적은 스크립트 끝에서 PHP 세션이 자동으로 닫히도록하는 것입니다.

 <?php
session_start();
session_register_shutdown();  // 세션 닫기 기능을 등록하십시오
?>

이 기능은 내부에 가까운 기능을 자동으로 등록하여 Session_Write_Close () 가 호출되고 세션 데이터가 작성되고 세션이 닫히도록합니다.


2. FAQ : 덮어 쓰거나 등록하지 않습니다

PHP의 등록 마감 기능은 콜백 메커니즘을 기반으로하므로 Register_Shutdown_Function ()이 코드 어딘가에 호출되고 Session_Register_Shutdown () 에 의해 등록 된 종료 콜백이 초과 작성되거나 세션을 수동으로 닫은 후 다른 작업이 호출되면 세션 마감 로직이 불완전하거나 건너 뜁니다.


3. 솔루션

3.1 Session_Register_Shutdown ()로 반복적 인 통화를 피하십시오.

코드가 Session_Register_Shutdown ()을 한 번만 호출해야합니다. 프레임 워크 또는 대규모 프로젝트에서 싱글 톤 또는 글로벌 상태는 함수가 한 번만 등록되도록하는 데 사용됩니다.

 <?php
if (!defined('SESSION_SHUTDOWN_REGISTERED')) {
    session_register_shutdown();
    define('SESSION_SHUTDOWN_REGISTERED', true);
}
?>

3.2 사용자 정의 닫힌 콜백, 체인 콜을 사용하십시오

추가 종료 함수를 등록 해야하는 경우 Session_Register_Shutdown () 에 의존하는 대신 콜백에서 Session_Write_Close ()를 수동으로 호출 할 수 있습니다.

 <?php
session_start();

register_shutdown_function(function() {
    // 세션을 먼저 닫는 작업을 수행하십시오
    session_write_close();
    
    // 스크립트 끝에서 수행 해야하는 다른 조치
    error_log("스크립트의 끝,다른 셧다운 작업을 수행하십시오");
});
?>

이 방법은 세션 종료가 항상 실행되고 덮어 쓰지 않도록합니다.


3.3 세션을 수동으로 닫지 않도록하십시오

Session_write_close () 가 호출되면 현재 세션 데이터가 작성되고 닫히고 후속 세션 쓰기 작업이 유효하지 않습니다. 코드에서 Session_Write_Close () 가 미리 호출되면 반복 된 호출을 피해야합니다.


3.4 종료 기능이 정상적으로 등록되어 있는지 모니터링하십시오

PHP는 등록 된 폐쇄 기능을 직접 쿼리하지는 않지만 충돌을 방지하기 위해 캡슐화 등록 프로세스를 통해 균일하게 관리 할 수 ​​있습니다.

 <?php
class ShutdownManager {
    private static $callbacks = [];

    public static function register(callable $callback) {
        self::$callbacks[] = $callback;
    }

    public static function run() {
        foreach (self::$callbacks as $callback) {
            call_user_func($callback);
        }
    }
}

session_start();
session_register_shutdown();

ShutdownManager::register('session_write_close');
ShutdownManager::register(function() {
    error_log("사용자 정의 스크립트 클로즈 작업");
});

register_shutdown_function(['ShutdownManager', 'run']);
?>

이를 통해 모든 셧다운 작업의 중앙 집중식 관리가 서로를 덮어 쓰지 않도록합니다.


4. 완전한 코드 샘플

 <?php
session_start();

// 한 번만 전화하십시오 session_register_shutdown()
if (!defined('SESSION_SHUTDOWN_REGISTERED')) {
    session_register_shutdown();
    define('SESSION_SHUTDOWN_REGISTERED', true);
}

// 추가 맞춤형 근접 기능
register_shutdown_function(function() {
    // 추가 종료 작업
    error_log("세션이 닫힌 후에 수행 된 추가 작업이 수행됩니다");
});

// 예제 액세스 URL
$url = "https://m66.net/path/to/resource";
echo "<a href=\"$url\">액세스 리소스</a>";
?>

요약

  • Session_Register_Shutdown () 에 대한 여러 통화를 피하고 상수 또는 상태를 사용하여 반복 등록을 방지하십시오.

  • register_shutdown_function ()을 통해 셧다운 작업은 균일하게 관리되며 Session_Write_Close ()는 수동으로 호출되어 세션 종료 로직이 항상 실행되도록합니다.

  • 호출 세션 _write_close () 를 미리 호출하지 않으면 후속 세션 쓰기 실패가 발생합니다.

  • 복잡한 프로젝트에서는 콜백 기능이 덮어 쓰는 것을 방지하기 위해 긴밀한 기능 관리를 캡슐화 할 수 있습니다.

위의 방법을 통해 Session_Register_Shutdown ()을 효과적으로 덮어 쓰거나 등록하지 못하면 PHP 세션이 닫힐 때 정상적인 작동 실행을 보장하고 세션 데이터의 보안 및 신뢰성을 향상시킬 수 있습니다.