어떻게 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 프로그램 이 실행 하 는 과정 원리 에 관 한 자 료 는 우리 의 다른 관련 글 을 주목 하 시기 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Laravel - 변환된 유효성 검사 규칙으로 API 요청 제공동적 콘텐츠를 위해 API를 통해 Laravel CMS에 연결하는 모바일 앱(또는 웹사이트) 구축을 고려하십시오. 이제 앱은 CMS에서 번역된 콘텐츠를 받을 것으로 예상되는 다국어 앱이 될 수 있습니다. 일반적으로 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.