__destruct & register_shutdown_도대체 누가 먼저

1984 단어
배경: 개발을 진행하는 과정에서register를 통해shutdown_function은 로그 리셋 디스크를 위한 함수를 등록했지만, 매번 대상의Destruct에서 인쇄한 로그는 디스크에 정확하게 새로 고칠 수 없고 공식 문서도 누가 먼저 실행했는지 설명하지 않았기 때문에 다음 원본을 보고 여러분과 공유해서 사람들이 구덩이를 밟지 않도록 합니다.
원본 보기:
분명히 register를 먼저 호출한 것 같은데...shutdown_function의 방법, 분석 함수 두 번째 단계 실행, 마지막flush buffer.
// php7.0.6    
//     :php-src/main/main.c
void php_request_shutdown(void *dummy)
{
……
    /* 1. Call all possible shutdown functions registered with register_shutdown_function() */
    if (PG(modules_activated)) zend_try {
        php_call_shutdown_functions();
    } zend_end_try();

    /* 2. Call all possible __destruct() functions */
    zend_try {
        zend_call_destructors();
    } zend_end_try();

    /* 3. Flush all output buffers */
    zend_try {
……
}

유효성 검사:
";
    });
    class Test {
        function __destruct() {
            echo "2.destruct
"; } } /* * $test, __destruct, * unset($test), */ $test = new Test();

수정 전: php test.php 1.shutdown 2.destruct
소스 코드를 수정하고 순서를 변경합니다.
// php7.0.6    
//     :php-src/main/main.c
void php_request_shutdown(void *dummy)
{
  ……
    /* 2. Call all possible __destruct() functions */
    zend_try {
        zend_call_destructors();
    } zend_end_try();

    /* 1. Call all possible shutdown functions registered with register_shutdown_function() */
    if (PG(modules_activated)) zend_try {
        php_call_shutdown_functions();
    } zend_end_try();

    /* 3. Flush all output buffers */
    zend_try {
……
}

수정 후 결과:php test.php 2.destruct 1.shutdown
결론: 요청이 끝난 후, PHP가 자동으로 방출하는 대상이 필요하며, PHP는 우선registershutdown_function에 등록된 함수, 이후 실행 대상의destruct, 따라서 최대한 섞지 마십시오destruct 및 registershutdown_function, 그들의 집행 순서가 너에게 영향을 미치지 않는다는 것을 알지 않으면.

좋은 웹페이지 즐겨찾기