The most dangerous phrase in the language is "We've always done it this way."
— Grace Hopper

TrueAsync의 RFC 프로세스

TrueAsync는 RFC 프로세스를 통해 PHP 코어를 변경할 수 있는 가능성을 발전시키고 있습니다.

주요 RFC
새 RFCDraft

Async Scheduler Hook API

작성자: Edmond [HT]v0.1PHP 8.x

PHP 코어 수준에서 동시 실행을 활성화하는 메커니즘입니다. 코어는 전용 훅을 제공하여 스케줄러 구현을 별도의 확장 모듈이나 심지어 PHP 코드로 분리할 수 있게 합니다.

핵심 원칙
  • 엄격한 옵트인: 스케줄러가 등록되기 전까지는 오버헤드가 전혀 없습니다
  • Fiber 호환: 기존 Fiber 코드가 계속 동작하며, Fiber는 스케줄러에 편입됩니다
  • Continuation: Fiber 기반 위에 구축된 대칭적인 A→B 컨텍스트 전환
  • 단일 등록 지점: SchedulerHook::register()가 엔진 전체에서 동시성을 활성화합니다
  • 코루틴별 컨텍스트 격리: 사용자 컨텍스트와 내부 컨텍스트를 분리
  • 생태계의 자유: 코어는 활성화와 스케줄러 인터페이스만 표준화하며, spawn() / await() / 채널은 구현에 맡겨집니다
GitHub에서 RFC 읽기
동기

PHP에 내장 비동기가 필요한 이유

PHP는 아직도 언어 수준에서 동시 실행에 대한 내장 지원이 없는 몇 안 되는 주요 언어 중 하나입니다. Python에는 asyncio가 있고, JavaScript는 이벤트 루프 위에 구축되어 있으며, Go에는 고루틴, Kotlin에는 코루틴이 있습니다. 대부분의 실제 애플리케이션이 시간의 대부분을 I/O 대기에 쓰는데도, PHP는 여전히 「하나의 요청, 하나의 프로세스」 패러다임에 머물러 있습니다.

파편화 문제

오늘날 PHP의 비동기는 확장 모듈에 존재합니다: Swoole, AMPHP, ReactPHP, 각각 호환되지 않는 API를 가진 자체 생태계입니다.

  • 각 확장 모듈이 자체 MySQL / PostgreSQL / Redis 드라이버를 다시 작성합니다
  • Swoole용 라이브러리는 AMPHP와 함께 동작하지 않으며, 그 반대도 마찬가지입니다
  • 코어 함수(file_get_contents, curl_exec)를 논블로킹으로 만들 수 없습니다
  • 높은 진입 장벽: 완전히 별개의 생태계를 배워야 합니다

해결책: 엔진 훅

TrueAsync는 PHP 엔진 수준에서 동시성을 위한 표준 이음새를 추가합니다.

  • 투명성: 동기 코드가 변경 없이 코루틴에서 실행됩니다
  • 색깔 있는 함수 없음: async/await 표시가 필요 없습니다
  • 통일된 표준: 모든 확장 모듈을 위한 엔진 내 단일 스케줄러 인터페이스
  • 하위 호환성: 기존 코드가 계속 동작합니다

일반적인 PHP 애플리케이션(Laravel, Symfony, WordPress)은 시간의 70~90%를 I/O 대기에 소비합니다. 코루틴을 사용하면 이 유휴 시간이 효율적으로 활용됩니다:

시나리오
코루틴 없이
코루틴 사용
각 20ms의 DB 쿼리 3개
60ms
~22ms
HTTP + DB + 파일
순차
병렬
API 호출 10회
10 × 지연
~1 × 지연
실용적인 시나리오
웹 서버 · FrankenPHP, RoadRunnerAPI Gateway · 병렬 집계백그라운드 작업 · 동시 큐실시간 · WebSockets, 스트리밍
역사

이전 RFC

이 두 RFC는 코어에 직접 내장된 완전한 동시성 모델을 설명했습니다. 새로운 접근 방식은 그 아이디어를 기반으로 하되, 사용자 대상 API를 코어 밖으로 옮기고 엔진에는 스케줄러 연결 지점만 남깁니다.

RFC #1Draft

PHP True Async

작성자: Edmond [HT]v1.7PHP 8.6+

PHP를 위한 동시성 모델을 정의하는 RFC입니다. 코루틴, spawn() / await() / suspend() 함수, Coroutine 객체, Awaitable 및 Completable 인터페이스, 협력적 취소, Fiber 통합, 오류 처리 및 graceful shutdown을 설명합니다.

핵심 원칙
  • 동시성을 활성화하기 위한 기존 코드의 최소한의 변경
  • 코루틴은 순차 실행의 착각을 유지합니다
  • I/O 작업 시 코루틴의 자동 전환
  • 협력적 취소, 「cancellable by design」
  • 확장 모듈을 위한 표준 C API
wiki.php.net에서 RFC 읽기
RFC #2Draft

Scope와 구조적 동시성

작성자: Edmond [HT]v1.0

True Async RFC의 확장입니다. 코루틴의 수명을 렉시컬 스코프에 묶는 Scope 클래스를 도입합니다. 스코프 계층 구조, 오류 전파, 「좀비」 코루틴 정책 및 protect()를 통한 임계 구역을 설명합니다.

해결하는 문제
  • 스코프를 벗어난 코루틴 누수 방지
  • 스코프 종료 시 자동 리소스 정리
  • 계층적 취소: 부모를 취소하면 모든 자식이 취소됩니다
  • 취소로부터 임계 구역 보호
  • 데드락 및 self-await 감지
wiki.php.net에서 RFC 읽기

이 RFC들의 관계

첫 번째 RFC는 저수준 프리미티브를 정의합니다: 코루틴, 기본 함수, 확장 모듈을 위한 C API. 두 번째 RFC는 구조적 동시성을 추가합니다: 동시성 코드를 안전하고 예측 가능하게 만드는 코루틴 그룹 관리 메커니즘입니다.

RFC #1: True Async
RFC #2: Scope
수준
프리미티브
관리
제공
spawn(), await(), Coroutine
Scope, TaskGroup, protect()
유사 개념
Go goroutines, Kotlin coroutines
Kotlin CoroutineScope, Python TaskGroup
목표
동시성 코드 실행
안전한 생명 주기 관리

토론에 참여하기

RFC는 internals@lists.php.net 메일링 리스트와 GitHub Discussions에서 논의됩니다. Discord에서의 대화에도 참여하세요.