Post

Repo Deep Dive: php/php-src — PHP 인터프리터를 빌드하고 웹 요청까지 실행하기

2026년 10월 23일 07:10 KST에 확인한 GitHub Trending 일간 전체 언어 목록에서 php/php-src는 1위였다. 이는 저장소 선정 시점의 순위 스냅샷으로, 글 발행 시점이나 이후의 실시간 순위를 뜻하지 않는다.

1. 프로젝트 소개

php/php-src는 PHP 언어의 인터프리터 소스가 공개된 공식 저장소다. PHP 프로젝트의 개발자와 기여자가 이곳에서 언어 실행기, 기본 제공 확장 기능, 여러 실행 방식에 관한 코드를 개발한다. 애플리케이션 개발자가 이 저장소를 복제하면 바로 완성된 웹 서비스를 얻는 것이 아니라, PHP 자체를 빌드·시험하거나 변경에 기여할 수 있는 원본을 얻는다. 실제로 웹 애플리케이션을 작성하려는 사람은 운영체제 패키지나 공식 배포 바이너리로 PHP를 설치한 뒤 스크립트를 실행하는 편이 출발점에 가깝다. 저장소 README도 미리 빌드된 패키지 사용과 Git 소스로부터의 빌드를 별도 경로로 안내한다.

PHP는 서버에서 웹 페이지를 만들 때 자주 쓰이지만 웹 요청 전용 도구는 아니다. 공식 문서에는 명령줄에서 스크립트를 실행하는 CLI 방식과 웹 서버를 거쳐 요청을 처리하는 방식이 각각 설명돼 있다. 그러므로 이 저장소를 살펴볼 때는 언어 문법만이 아니라, 작성한 코드를 어떤 실행 환경으로 호출하고 어떤 결과를 받는지 구분할 필요가 있다.

2. 해결하려는 문제

정적인 HTML만으로는 요청마다 달라지는 사용자 입력이나 데이터 조회 결과를 반영하기 어렵다. PHP는 HTML 사이에 PHP 구문을 넣거나 PHP 스크립트에서 응답을 생성해, 서버에서 입력을 처리한 다음 결과를 브라우저에 보낼 수 있게 한다. 공식 입문 예시는 <?php echo ... ?>가 들어 있는 파일을 개발 서버에 요청했을 때 PHP 구문 자체가 아닌 실행 결과가 출력되는 모습을 보여 준다. 파일을 단순히 내려받는 것과 서버가 파일을 해석해 응답을 만드는 것은 다른 동작이다.

동시에 언어 실행 환경을 운영체제·용도에 맞게 마련해야 한다. 패키지 설치만으로는 특정 수정 사항을 검증하거나 PHP 자체의 결함을 고치기 어렵고, 반대로 소스 빌드는 도구와 라이브러리 준비가 필요하다. php-src는 후자를 위한 빌드 및 테스트 절차를 공개한다. README에 따르면 Git에서 가져온 소스를 최소 구성으로 빌드할 때 autoconf, bison, re2c가 필요하고 기본 빌드에는 libxml2, libsqlite3도 필요하다. 이는 모든 PHP 사용자가 소스를 컴파일해야 한다는 뜻이 아니라, 인터프리터를 직접 시험할 때 필요한 경로다.

3. 주요 기능

웹 페이지의 서버 측 실행. 입력은 .php 파일과 웹 요청이다. 공식 첫 페이지 예시에서는 HTML 안의 echo가 실행되어 브라우저에 Hello World가 포함된 HTML이 전달된다. HTML 원본에 PHP 태그가 남는 것이 아니라 해당 구문의 출력이 응답에 들어간다는 점이 정적 파일 제공과 다르다. 공식 폼 예시에서는 POST 요청의 name과 age를 $_POST로 읽고, 이름에는 htmlspecialchars()를 적용하며 나이는 정수로 변환해 보여 준다. 이 예시는 입력을 그대로 HTML에 삽입하지 않고 출력 맥락에 맞게 처리하는 구체적인 절차를 보여 주지만, 모든 입력 검증 문제를 자동으로 해결한다는 뜻은 아니다.

명령줄 실행과 개발 서버. CLI 방식은 셸에서 PHP 스크립트를 호출해 터미널에 출력을 돌려준다. 이에 비해 php -S localhost:8000은 현재 작업 디렉터리를 문서 루트로 하는 내장 웹 서버를 띄워 브라우저 요청을 받는다. 공식 문서는 -t로 문서 루트를 지정하거나 라우터 스크립트를 전달할 수 있다고 설명한다. 라우터가 false를 반환하면 요청된 정적 파일을 그대로 제공한다. 내장 서버는 개발·시험용이며, 공식 문서는 공개 네트워크나 운영 환경에 사용하지 말라고 명시한다. 따라서 로컬 예시의 localhost 주소를 실제 서비스 배포 구성으로 읽으면 안 된다.

확장을 통한 기능 추가. README는 PHP에 기본 제공 확장이 다수 포함되고 별도 확장도 설치할 수 있다고 안내한다. 예를 들어 공식 PDO 문서에 따르면 PDO는 데이터베이스 접근을 위한 일관된 인터페이스를 제공하지만, 연결할 데이터베이스의 PDO 드라이버가 별도로 필요하다. PDO를 설치했다는 사실만으로 어느 데이터베이스에든 접속할 수 있는 것은 아니다. prepare()로 문장을 준비하고 execute()로 실행한 뒤 fetch()로 결과를 읽는 API가 제공된다. JSON 확장은 json_encode()로 PHP 값을 JSON 표현으로 만들고 json_decode()로 JSON 문자열을 읽는다. 웹 응답 형식과 데이터 저장소 접근은 모두 PHP에서 다룰 수 있지만, 각각 사용하는 확장과 결과 형식이 다르다.

소스 테스트와 기여. README는 컴파일 뒤 make test를 실행하는 절차를 제공한다. 전체 검사뿐 아니라 make TESTS=tests/lang/ test처럼 특정 테스트 경로만 대상으로 삼거나 TEST_PHP_ARGS=-j4로 동시 실행 작업 수를 조절할 수 있다. 이 결과는 소스 수정이 기존 테스트에 미치는 영향을 확인하는 자료다. 새 언어 기능은 RFC와 개발자 투표가 필요하다고 기여 안내에 적혀 있고, 버그 수정은 동일한 RFC 절차를 요구하지 않는다고 구분한다. 저장소에 기능 제안을 올리는 것만으로 언어 사양이 확정되는 구조는 아니다.

4. 사용 방법과 동작 흐름

PHP를 사용해 보는 최소 경로는 설치된 PHP CLI를 확인하고 작은 파일을 실행하는 것이다. 운영체제별 설치 방법은 공식 설치 문서를 따른다. 다음 예시는 공식 입문 문서의 첫 페이지와 같은 echo 동작을 로컬에서 확인한다.

php -v
printf '%s\n' '<?php echo "Hello World!"; ?>' > hello.php
php hello.php
php -S localhost:8000

세 번째 명령의 표준 출력에는 Hello World!가 나타난다. 마지막 명령은 서버를 계속 실행하므로 다른 터미널이나 브라우저에서 http://localhost:8000/hello.php에 접속한다. 이때 브라우저에 보이는 것은 PHP 소스가 아니라 스크립트 실행 결과다. php -v에서 CLI인지도 확인할 수 있다. 개발 서버를 중지하려면 실행 중인 터미널에서 Ctrl-C를 누른다. 예시 파일을 놓은 디렉터리에서 서버를 시작했는지 확인해야 404 응답과 스크립트 오류를 구분할 수 있다.

인터프리터 자체를 수정하거나 최신 소스를 시험하려면 별도 흐름을 따른다. README의 Ubuntu 예시는 빌드 도구와 개발용 라이브러리를 설치한 후 소스에서 ./buildconf, ./configure --enable-debug, make -j4, make test를 순서대로 실행한다. --enable-debug는 개발용 빌드에 권장되고, 일반 빌드는 ./configure로 안내돼 있다. 빌드에 성공하면 소스 트리의 CLI 실행 파일을 시험할 수 있으며, make install은 별도의 설치 단계다. 설치는 시스템 경로를 변경할 수 있으므로 로컬 예제를 돌리는 것과 동일한 필수 절차가 아니다. 테스트가 실패하면 어떤 테스트에서 실패했는지 먼저 살피고, 단순히 컴파일이 끝났다는 이유만으로 수정 사항이 검증됐다고 보지 않아야 한다. 특히 이 절차는 배포판에 이미 설치된 PHP가 아니라 지금 가져온 소스의 동작을 살펴보는 과정이다. 같은 명령 이름을 쓰더라도 어떤 실행 파일이 호출되는지에 따라 버전과 로드되는 확장이 달라질 수 있으므로, 결과를 비교할 때 실행 파일과 설정을 함께 확인하는 편이 정확하다.

5. 활용 사례

작은 동적 페이지 검증. 공식 입문 문서처럼 PHP 파일에 HTML과 echo를 함께 쓰고 내장 서버로 결과를 본다. 요청한 URL에서 PHP 태그 대신 생성된 문장이 보이는지 확인하면 서버 측 실행의 기본 흐름을 관찰할 수 있다. 이어 공식 폼 예시처럼 POST로 보낸 값을 $_POST에서 읽어 표시하면 정적 페이지에는 없던 요청별 응답 차이도 확인할 수 있다.

로컬 라우팅 시험. 공식 내장 서버 문서는 php -S localhost:8000 router.php 형식을 제시한다. 라우터는 요청마다 먼저 실행되며, 이미지 요청처럼 정적 리소스를 그대로 보내려면 false를 반환한다. 나머지 요청에는 PHP가 생성한 문장을 응답으로 보낼 수 있다. 이 방법은 개발 중 URL 처리와 정적 파일 제공을 함께 확인하기 위한 것이지, 운영 서버의 동시 요청 처리 능력을 입증하는 사례가 아니다.

언어 변경의 회귀 확인. PHP 실행 동작을 수정하는 기여자는 소스 빌드 후 make test로 기존 테스트를 돌리고, 관련 영역의 테스트만 재실행해 수정 전후를 비교할 수 있다. 실패한 테스트가 무엇인지 기록한 뒤 수정 코드를 검토하는 흐름이다. README가 테스트 범위 지정과 병렬 실행 옵션을 모두 설명하므로, 전체 테스트와 좁은 범위의 반복 검사를 구분해 사용할 수 있다.

6. 참고 자료

댓글