PHP

PHP 동작방식 - 생명주기

마리오64 2022. 3. 27. 23:55

PHP 재단 소식 보다가 PHP internals Book을 정리한다고 해서 보게 되었습니다.

생명주기:

프로그램은 시작되고 어떤 것이 로딩되고 실행 후 끝나고 하는 생명주기가 있습니다.

PHP The internals Book (PHP 내부 동작에 관한문서) 에 관련 내용이 자세하게 나와있습니다.

 

PHP로 작성한 코드를 실행하는 환경은 크게 두 가지가 있습니다.

1) CLI (터미널에서 실행) 하나의 요청을 처리하는 환경,

2) 웹 서버와 SAPI 인터페이스를 통해 여러 웹 요청을 처리하는 환경입니다.

 

1. 의 경우 간단한데요

php -s 로 시작하는 php내장 개발 서버도 여기에 해당하죠

PHP 엔진에서 해당 프로그램을 실행 후 종료합니다.

 

2. 웹서비스를 하려면 PHP를 nginx , 아파치등 웹서버를 통해 실행하게 되죠

여기 리눅스, 유닉스에서 실행하는 프로세스 기반 환경과 윈도우 IIS 서버에서 실행하는 쓰레드 기반 환경이 있습니다.

 

기본적인 PHP 프로그램의 생명주기입니다.

php_module_startup

MINIT:  module init PHP용 c 익스텐션들이 로딩됩니다 프로세스나 쓰레드는 아직 없습니다.

RINIT:  request init 요청(리퀘스트) 후 초기화 단계 프로세스 또는 쓰레드에 요청이 전달되어 프로그램이 시작됩니다. 라라벨 등 프레임워크가 부팅, DB 커넥션 생성 등

수행 - 프레임워크, 사용자 프로그램이 요청에 따라 실행

RSHUTDOWN: PHP는 기본적으로 프로그램 시행 후 사용자 프로그램, 프레임워크 등을 종료하고

메모리를 정리하고 DB 연결까지 종료하게 됩니다.

이후  프로세스 모델, 쓰레드 모델에 따라 RINIT이 실행되거나 다음 단계로 가게 됩니다.

MSHUTDOWN:  프로세스가 종료되고 INI설정과 PHP C익스텐션들이 메모리에서 해제되고

PHP VM이 종료됩니다.

 

* PHP VM은 PHP를 실행하는 인터프리터, opcode 생성을 포함한 PHP 를 실행하는 가상 머신입니다.

 

 

 

멀티 프로세스 환경입니다.

각 프로세스끼리는 영향이 없고 쓰레드도 독립되어 메모리가 안전하다고 TS 모드로 부릅니다.

 

하나의 프로세스는 하나의 PHP VM을 실행합니다.

PHP VM은 1~수천번의 웹 요청(리퀘스트)을 수행하고 웹서버의 프로세스 정책에 따라 종료하게 됩니다.

여기서 그동안 잘못 알고 있던 내용은 사용자가 어떤 요청을 ->실행 후 -> 바로 프로세스 종료가 아니라는 점입니다.

PHP-FPM이나 아파치의 prefork 방식의 프로세스 관리 정책에 따라 PHP 서버의 성능이

차이나는 이유이기도 합니다.

 

윈도우용 서버 IIS는 쓰레드로 실행하는 모델입니다. C익스텐션은 쓰레드와 공유하므로 NTS 모드라고 부릅니다.


각각의 PHP 엔진이 쓰레드마다 실행되는데

 

사용자의 요청 -> 쓰레드 생성-> 수행 -> 쓰레드 종료 방식으로

사용자의 요청에 따라 무수히 많은 PHP VM은 스레드를 생성 종료하는것을 반복하게 됩니다.

 

요약: PHP 는 사용자 요청마다 프로세스를 생성 삭제 하는것이 아닌 리소스만 초기화한다.

 

평소 익스텐션들 TS, NTS 이 뭔지 제대로 몰랐던 거를 보게 되었네요.

그 외에도 사용하려는 PHP익스텐션들이 리눅스만 지원하는 경우도 있기 때문에 리눅스 서버를 선호합니다.

 

출처:

https://www.phpinternalsbook.com/php7/extensions_design/php_lifecycle.html

 

Learning the PHP lifecycle — PHP Internals Book

Learning the PHP lifecycle PHP is a complex piece of machinery whose lifecycle really should be understood by anyone who wants to understand how PHP operates. The main sequence is as follows: PHP starts up. If running CLI or FPM, it’s C main() is run. If

www.phpinternalsbook.com

용어: TS: Thread Safe 쓰레드 안전 (각 스레드의 메모리가 독립적)

NTS: None Thread Safe 쓰레드가 안전하지 않음(메모리가 공유되는 모드라서)