어떻게 PHP 프로그램 이 실행 하 는 과정 원 리 를 이해 합 니까?

4479 단어 php실행 원리
개술
웹 환경 은 아파 치 라 고 가정 합 니 다.PHP 를 컴 파일 할 때 아파 치가 PHP 를 지원 할 수 있 도록 mod 를 생 성 합 니 다.php 5.so 모듈.아파 치 는 이 모듈 을 불 러 옵 니 다.url 에서.php 파일 에 접근 하면 mod 에 게 전 달 됩 니 다.php 5.so 모듈 로 처리 합 니 다.
이것 이 바로 우리 가 흔히 말 하 는 SAPI 다.영어 이름:Server Application Programming Interface.SAPI 는 사실 통칭 으로 그 아래 에 ISAPI,CLI SAPI,CGI 등 이 있다.그것 이 있 으 면 다른 것 과 쉽게 상호작용 을 할 수 있다.예 를 들 어 APACHE,IIS,CGI 등 이다.
Apache 시작 후 modpho5.so 모듈 의 hook handler 가 등록 되 어 있 습 니 다.아파 치가 방문 한 url 이 phop 파일 이라는 것 을 알 았 을 때 이 럴 때 SAPI 에 제어 권 을 넘 깁 니 다.SAPI 에 들 어가 면 먼저 sapi/apache/mod 를 실행 합 니 다.php 5.c 파일 의 phpinit_handler 함수,
여기 코드 를 발췌 합 니 다.

static void php_init_handler(server_rec *s, pool *p)
{
    register_cleanup(p, NULL, (void (*)(void *))apache_php_module_shutdown_wrapper, (void (*)(void *))php_module_shutdown_for_exec);
    if (!apache_php_initialized) {
        apache_php_initialized = 1;
        #ifdef ZTS
        tsrm_startup(1, 1, 0, NULL);
        #endif
        sapi_startup(&apache_sapi_module);
        php_apache_startup(&apache_sapi_module);
    }
    #if MODULE_MAGIC_NUMBER >= 19980527
    {
        TSRMLS_FETCH();
        if (PG(expose_php)) {
            ap_add_version_component("PHP/" PHP_VERSION);
        }
    }
    #endif
}
이 함 수 는 주로 두 개의 함 수 를 호출 합 니 다:sapistartup(&apache_sapi_module); php_apache_startup(&apache_sapi_module);

static int php_apache_startup(sapi_module_struct *sapi_module)
{
    if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {
        return FAILURE;
    } else {
        return SUCCESS;
    }
}
sapi_startup sapi 만 들 기globals_struct 구조 체.sapi_globals_struct 는 서버 정보,Header,인 코딩 등 아파 치가 요청 한 기본 정 보 를 저장 합 니 다.sapi_startup 실행 완료 후 php 실행apache_startup。

static int php_apache_startup(sapi_module_struct *sapi_module)
{
    if (php_module_startup(sapi_module, &apache_module_entry, 1) == FAILURE) {
        return FAILURE;
    } else {
        return SUCCESS;
    }
}
php_module_startup 내용 이 너무 많 습 니 다.대체적인 역할 을 소개 합 니 다.
1.zend 초기 화utility_functions 구조 입 니 다.이 구 조 는 zend 의 함수 지침 을 설정 하 는 것 입 니 다.예 를 들 어 오류 처리 함수,출력 함수,흐름 조작 함수 등 입 니 다.
2.환경 변 수 를 설정 합 니 다.
3.php.ini 설정 을 불 러 옵 니 다.
4.php 내장 확장 을 불 러 옵 니 다.
5.일 지 를 쓴다.
6.php 내부 함수 집합 을 등록 합 니 다.
7.php 호출ini_register_확장,모든 외부 확장 불 러 오기
8.모든 확장 오픈
9.청소 작업.
포인트 로 3,4,7,8.
php.ini 설정 불 러 오기

if (php_init_config(TSRMLS_C) == FAILURE) {
    return FAILURE;
}
php_init_config 함 수 는 여기에서 모든 php.ini 설정 을 검사 하고 불 러 온 모듈 을 찾 아 php 에 추가 합 니 다.extension_lists 구조 중.
php 내장 확장 불 러 오기
zend 호출register_standard_ini_entries 는 array,my sql 등 모든 phop 내 장 된 확장 자 를 불 러 옵 니 다.
php 호출ini_register_확장,모든 외부 확장 불 러 오기
main/php_ini.c

void php_ini_register_extensions(TSRMLS_D)
{
    zend_llist_apply(&extension_lists.engine, php_load_zend_extension_cb TSRMLS_CC);
    zend_llist_apply(&extension_lists.functions, php_load_php_extension_cb TSRMLS_CC);

    zend_llist_destroy(&extension_lists.engine);
    zend_llist_destroy(&extension_lists.functions);
}
zend_llist_apply 함수 옮 겨 다 니 기 extensionlists 리 셋 함수 php 실행load_php_extension_cb

static void php_load_zend_extension_cb(void *arg TSRMLS_DC)
{
    zend_load_extension(*((char **) arg));
}
이 함수 마지막 호출

if ((module_entry = zend_register_module_ex(module_entry TSRMLS_CC)) == NULL) {
    DL_UNLOAD(handle);
    return FAILURE;
}
확장 정 보 를 Hash 표 moduleregistry 중,Zend/zendAPI.c

if (zend_hash_add(&module_registry, lcname, name_len+1, (void *)module, sizeof(zend_module_entry), (void**)&module_ptr)==FAILURE) {
    zend_error(E_CORE_WARNING, "Module \'%s\' already loaded", module->name);
    efree(lcname);
    return NULL;
}
마지막,zendstartup_modules(TSRMLS_C); 모듈 을 정렬 하고 module 에 등 록 했 는 지 확인 합 니 다.registry HASH 표 에zend_startup_extensions(); extension->startup(extension)실행 하기;시작 확장.
이상 은 PHP 프로그램 이 실행 하 는 과정 원 리 를 어떻게 이해 하 는 지 에 대한 상세 한 내용 입 니 다.더 많은 PHP 프로그램 이 실행 하 는 과정 원리 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!

좋은 웹페이지 즐겨찾기