Yaconf
Yaconf (Yet Another Configurations Container)
PHP 애플리케이션의 설정 파일을 빠르게 읽어 오고 싶을 때 쓰는 확장이에요. Yaconf는 INI 파일을 PHP 시작 시점에 파싱해서 결과를 PHP 수명 전체 동안 영구 메모리에 보관해요. 그래서 매번 값을 꺼낼 때 파일 I/O 없이 빠른 해시 조회만으로 끝나요.
출처: Yaconf
본문
소개
Yaconf(Yet Another Configurations Container)는 설정 컨테이너예요. PHP가 시작할 때 INI 파일을 파싱하고 그 결과를 PHP 수명 전체 동안 영구 메모리에 보관해요. 따라서 조회할 때마다 파일 I/O도, 요청마다 파싱도 없이 빠른 해시 조회로 값을 얻어요.
Yaconf는 모든 설정을 interned strings나 불변(immutable) 배열로 저장해요. 참조 카운트(refcount)를 하지 않기 때문에, Yaconf에서 설정을 가져오는 건 사실상 zero-copy예요. Yaconf 1.2.0부터는 파싱된 설정 트리 전체를 단일 연속 블록(contiguous block)으로 압축해서, 메모리 오버헤드를 낮추고 캐시 지역성(cache locality)을 높여요.
파싱된 설정은 PHP-FPM 워커들이 copy-on-write 방식으로 공유하는 영구 메모리에 있어요. 설정 파일이 바뀌지 않는 한, 워커가 몇 개든 같은 물리 메모리 페이지를 공유하죠.
Yaconf는 INI 파일에서 섹션(section)과 섹션 상속(section inheritance)을 지원해요. non-ZTS 빌드에서는 파일이 바뀌면 자동으로 다시 로드하고, ZTS(스레드 안전) 빌드에서는 시작 시점에 설정을 로드하며 변경 사항을 반영하려면 재시작이 필요해요.
Yaconf 1.2.0부터는 설정 디렉터리의 하위 디렉터리도 재귀적으로(최대 16단계 깊이) 로드되고, 디렉터리 이름이 키 레벨로 매핑돼요. 예를 들어 Yaconf::get("users.database.master")는 users/ 하위 디렉터리의 database.ini 파일에 있는 master 키를 읽어요.
민감한 설정을 웹 트리 밖에 보관하면 공격 표면도 줄어들어요. 웹 루트 아래 설정 파일은 파일 노출(file disclosure) 취약점 등으로 공격자가 가져갈 수 있으니까요. Yaconf에서는 .ini 파일을 /etc/yaconf처럼 root만 읽을 수 있는 디렉터리에 두면 돼요. PHP-FPM 마스터가 서비스 시작 시 설정을 로드하고, 웹 요청을 처리하는 포크된 워커(비특권 사용자로 실행)는 그 디렉터리에 접근할 필요도, 권한도 없어요.
Yaconf는 PHP 7.0 이상이 필요해요.
함수 참조
클래스 참조 (Yaconf)
Yaconf::__debug_info— Inspect how a configuration value is storedYaconf::get— Retrieve a configuration value by nameYaconf::has— Check whether a configuration value exists
더 알아보기
- 설정을 자주 읽어 오는 애플리케이션에서 파일 파싱 오버헤드를 없애고 싶을 때 특히 유용해요. 특히 요청마다 설정을 다시 읽어야 하는 고트래픽 서비스에 잘 어울려요.
- ZTS 빌드에서는 설정 변경이 즉시 반영되지 않으니, 설정 변경 시 재시작이 필요하다는 점을 염두에 두세요.