원문 캡처 · tomasvotruba.com
원문 캡처 · tomasvotruba.com

PHP 개발 도구를 Go나 Rust로 만들면 PHP 버전·패키지 의존성 충돌을 줄이고 실행 시간을 단축할 수 있다는 주장이다. 글쓴이는 직접 만든 Go 도구 Reco로 약 100개의 Rector 규칙을 1초 안에 실행하고, 관련 작업을 30초 만에 마쳤다고 설명한다.

글쓴이는 PHP 8.4를 요구하는 PHPUnit 13과 관련 패키지 호환성 문제, PHP 8.3 이상이 필요한 PHPStan Turbo를 예로 들며 최신 도구를 오래된 PHP 프로젝트에 적용하기 어렵다고 말한다. 비공개 PHP 프로젝트 상당수가 최신 PHP 버전을 쓰지 않지만, 이런 프로젝트일수록 최신 버전으로 옮기는 데 개발 도구가 필요하다는 게 글쓴이의 주장이다. Go나 Rust로 만든 도구가 composer.json에서 프로젝트의 PHP 버전을 읽고, 해당 버전에 맞는 파서를 사용하며, 코드를 자동 로드하지 않고 정적 분석한다면 PHP 버전 제약과 도구 간 충돌을 줄일 수 있다고 제안한다.

속도와 개발 흐름

글쓴이는 Rector와 PHPStan을 자주 실행하던 중 에이전트도 코드 변경 뒤 테스트·정적 분석·Rector를 반복 실행해 CPU 사용량이 커지고 노트북 배터리 사용 시간이 줄었다고 설명한다. 한 사례에서는 에이전트가 작업을 나누고 로컬에서 CI를 병렬 실행하면서 12개 프로세스가 각각 24개 코어를 요청해 작업이 느려졌다고 한다.

글쓴이는 도구가 수십 초가 아니라 다른 개발 도구처럼 빠르게 실행돼야 에이전트가 여러 검사를 병렬로 돌릴 수 있다고 주장한다. 다만 ECS·PHPStan·Rector·PHPUnit을 각각 0.5초 또는 1초 미만에 실행할 수 있다는 내용은 목표로 제시한 수치이지, 글에서 비교 실험으로 입증한 결과는 아니다.

Reco로 수행한 작업

글쓴이는 Go로 만든 로컬 도구 Reco에 PHP 파서와 PHP 8 지원을 추가한 뒤 약 100개의 Rector 규칙을 실행했고, 1초가 채 걸리지 않았다고 밝혔다. 이어 규칙을 그룹별로 정렬하고, 규칙별 커밋과 그룹별 PR을 만들며, 새 브랜치를 준비하고 gh api로 PR을 여는 작업을 30초 만에 처리했다고 설명한다. 기존 Rector와 PHPStan을 이용하면 같은 작업이 모든 코어를 사용해도 10~15분 걸릴 수 있다는 비교도 덧붙였다.

글쓴이는 프로젝트 전체의 클래스 계층, 인터페이스와 trait 사용, 테스트에서 모킹된 클래스, 리플렉션으로 변경되는 요소를 한꺼번에 파악하는 정적 분석도 구상한다. 현재 php-parser로 클래스 계층만 찾는 규칙은 30~40초가 걸렸지만, Reco에서는 1초 미만에 실행할 수 있다고 주장한다. 이는 글쓴이가 소개한 구현 경험과 전망이며, 독립적인 성능 검증 결과는 제시되지 않았다.

글은 PHP 파서를 Go나 Rust로 옮길 때 필요한 지식과 유지보수상의 주의점을 다음 글에서 다루겠다고 예고한다.