피드로 돌아가기
Dev.toBackend
원문 읽기
PHP 8.6 Polling API 도입으로 C10K 문제 해결 및 OS 네이티브 I/O Multiplexing 구현
The Polling API Is the Most Underrated RFC PHP Has Shipped in Years
AI 요약
Context
1983년 설계된 select() 기반의 stream_select() 함수 사용으로 인한 파일 디스크립터 제한 및 O(n) 시간 복잡도 발생. 이로 인해 고성능 Async 런타임 구현을 위해 ext-uv 같은 외부 확장 모듈에 의존해야 했던 구조적 한계 존재.
Technical Solution
- Io\Poll 네임스페이스 내 Context 및 StreamPollHandle 클래스를 통한 추상화 계층 설계
- 실행 환경에 따라 epoll(Linux), kqueue(BSD/macOS), event ports(Solaris), WSAPoll(Windows) 중 최적의 백엔드를 자동 선택하는 폴리필 구조 채택
- 전체 디스크립터를 스캔하는 대신 이벤트가 발생한 Watcher만 반환하는 wait() 메서드 구현을 통한 효율적 I/O 처리
- 내부 php_poll.h 헤더 제공으로 PHP Core 및 Extension 수준에서 공유 가능한 Unified Polling Interface 구축
- ZTS(Zend Thread Safety) 환경 내 안전하고 효율적인 Signal Handling 가능 구조 확보
- Userland 이벤트 루프 라이브러리가 다수의 드라이버 백엔드 유지보수 없이 단일 네이티브 인터페이스를 사용할 수 있는 기반 마련
실천 포인트
1. 고성능 I/O 처리가 필요한 서비스에서 OS별 네이티브 Multiplexing API(epoll/kqueue) 활용 여부 검토
2. 외부 확장 모듈 의존성을 줄이기 위한 표준 인터페이스 추상화 계층 설계 적용
3. O(n) 스캔 방식의 폴링 로직을 이벤트 기반의 트리거 방식으로 전환하여 CPU 리소스 낭비 제거