[PHP] PHP의 구조와 특징

[원본 링크]

PHP는 참... 여러모로 독특하고 개성적인 언어다.
PHP의 독특함과 자유분방함은 단순히 동적타입이고 스크립트 언어인데서 나오지 않는다.

PHP의 개략적인 특징들을 정리해보겠다.



서버 전용 언어

PHP는 웹서버 전용 언어다. 애초에 이름부터가 원래 Personal Home Page의 준말이었다.
이젠 아니라고 하지만 실상 지금도 그 컨셉에서 크게 벗어나지 않는다.

범용 언어로서는 거의 사용할 수 없고, 하려고 하지도 않는다.
PHP가 만능언어고 모든걸 할 수 있다고 우겨대는 사람이 가끔 있는데, 무시해도 된다.



동적 타입

PHP는 여타 스크립트 언어와 마찬가지로 동적타입 언어다.
요즘에 와서는 약간의 타입 힌팅같은게 가능하긴 하지만, 기본적으로는 타입체크를 런타임에 하는 동적언어다.

PHP의 문턱을 낮춰준 중요한 요소 중 하나다.



메모리 관리 언어?

PHP는 메모리를 자동으로 관리하는 managed 언어다. GC는 5.3부터 추가되었다.

그런데 사실 PHP는 GC가 딱히 필수적이지 않은 구조를 갖고 있어서 GC가 별로 뛰어나지도 않고 열심히 하지도 않는 편이다. 이유는 후술한다.



다운타임 없음 (FTP 지향 배포)

대부분의 서버 작성용 언어들은 코드를 수정하고 재배포를 하게 되면 기본적으로 다운타임이 발생한다. 프로그램을 내리고 새 버전을 올려야 하기 때문이다.
이런 언어들은 인프라 수준의 접근법으로 다운타임을 제거하는데, PHP는 그런게 필요가 없을 때가 많다.

PHP는 굉장히 신기한 특유의 구조를 갖고있어서, FTP로 새 버전의 소스코드를 업로드하면 그게 다운타임 없이 바로 반영이 되기 때문이다.
지금도 대부분 그렇게 쓰고 있기도 하다.



서버리스 (Serverless) 구조

근래에 AWS Lambda니 Firebase니 하며 서버리스라는 구조가 크게 떴는데, 사실 PHP가 태초의 서버리스 아키텍처라고 부를 수도 있을 것 같다.

만약 PHP로 작성된 서버에 HTTP 요청이 들어오면 어떻게 동작할 것 같은가?
일반적인 언어라면 해당 요청만을 처리하는 쓰레드나 그린 쓰레드를 새로 생성하겠지만, 그래도 단일 앱 단위에서 처리가 될 것이다.

PHP는 그렇지 않다.
요청이 들어오면 PHP 중앙 관리자는 요청 하나마다 워커 프로세스라는 것을 만든다.

이 워커 프로세스라는게 뭐냐면, 그냥 OS 프로세스다!

그냥 하나의 요청 컨텍스트를 별도의 격리된 OS 프로세스에 띄우는 것이다. 그리고 요청 처리가 끝나면 프로세스는 죽는다.

OS 프로세스가 죽으면 OS가 그 자원을 자동으로 정리해준다. 그래서 GC가 딱히 중요하지 않다.
누수 좀 내도 된다.

동시성이나 핸들링이나 귀찮은 문제도 그냥 OS 처리 능력에 달려있으니 신경쓸게 별로 없다.

PHP 매니저는 그냥 요청에 대응하는 파일을 읽어서 별도의 프로세스를 띄워버린다. 그래서 파일을 건드려도 그 전에 뜬 프로세스는 알아서 잘 돈다. 결국 다 다른 앱이니까!
FTP만 써도 다운타임이 잘 없는 이유다.

각 요청 프로세스는 실상 별개의 앱이다. 그래서 디비를 물려놓으면 요청 하나마다 커넥션 하나씩 물고 뜬다. 요청이 몰리면 mysql connection limit 에러가 잘 뜨는 이유다.

그야말로 OS에게 모든 것을 짬때려서 날로 먹는 스탠스를 취하고 있는 것이다.

이게 리소스 효율적인 구조인지는 모르겠지만, 대충 만들기 좋은 구조이긴 하다. 언어 개발자도. 언어 사용자도.

이런 초월적이고 유니크한 속성, 배우기도 쉽고 생각없이 쓰기 좋은 구조 탓에 PHP는 수많은 비난과 억까에도 불구하고 여전히 성세를 이어나가고 있다.


참조
https://stackoverflow.com/questions/60243055/are-php-workers-the-same-as-child-processes
https://stackoverflow.com/questions/9985030/how-does-the-garbage-collector-work-in-php