
# 소개
Phasis는 순수 PHP로 구현된 JavaScript 엔진입니다. 호스트 PHP 프로세스에서 ECMAScript를 어휘 분석, 파싱 및 실행하며, `exec('node …')`나 FFI 또는 사용자 지정 바이너리 확장이 필요하지 않습니다. 표준 PHP 확장 세 가지가 필요합니다. `ext-mbstring`, `ext-bcmath`, `ext-curl`(기본 `fetch()` 전송 계층)입니다. `ext-intl`과 `ext-openssl`은 선택 사항입니다. `bcmath`가 포함되지 않은 빌드는 [시작하기](https://phasis.inline0.dev/ko/docs/getting-started)를 참조하세요.

- **임베드 가능** — `Phasis\Engine` 클래스를 사용해 어떤 PHP 앱, 프레임워크 또는 CLI 도구에도 JS 런타임을 추가할 수 있습니다.
- **사양 준수** — 공식 test262 테스트 스위트에서 모든 범주를 건너뛰기 없이 100 % 통과합니다.
- **웹 API** — **Web Platform Pack** 전체(URL, TextEncoder/Decoder, atob/btoa, structuredClone, performance, DOMException), **Fetch Pack** 전체(fetch, Request, Response, Headers, Body, AbortController/Signal, Blob, File, FormData, EventTarget, 전체 WHATWG Streams, navigator), 그리고 `crypto` + `SubtleCrypto`, `WebSocket`, `XMLHttpRequest` 및 실제 이벤트 루프를 제공합니다. 가져온 Web Platform Tests의 100 %를 통과합니다.
- **최신 기능** — 화살표 함수, 클래스, async/await, Promises, 제너레이터, Symbol, BigInt, Proxy, Reflect, Temporal, Intl, TypedArrays, 전체 모듈 지원.
- **PHP↔JS 상호 운용** — PHP 스칼라와 배열을 JS로 전달하고(배열은 복사됨), PHP 클로저를 JS 함수로 바인딩하며, PHP에서 JS 함수를 호출할 수 있습니다. PHP 객체는 아직 JS와 공유할 수 없습니다. [공유 객체](https://phasis.inline0.dev/ko/docs/interop/shared-objects)를 참조하세요.

## Phasis가 필요한 이유

사용자가 제공한 JavaScript를 실행해야 하는 PHP 애플리케이션(템플릿 엔진, 프런트엔드 SSR 심, 데이터 검증 규칙, 콘텐츠 샌드박스, 헤드리스 테스트 러너 등)은 보통 Node.js를 외부 프로세스로 실행하거나 해당 기능을 포기합니다. 어느 쪽이든 운영 복잡성이 커집니다. 두 번째 런타임, 직렬화 경계, 여러 하위 프로세스 파이프, 공유 호스팅에 적합하지 않은 배포 방식이 추가됩니다.

Phasis는 이 간극을 해소합니다. PHP 코드만으로 JavaScript를 어휘 분석, 파싱 및 실행할 수 있으며, PHP 8.2+와 `mbstring`, `bcmath`, `curl`만 있으면 됩니다. 엔진은 Composer 패키지로 제공되며 작고 간결한 API 인터페이스를 노출합니다.

## 기능

- 전체 ECMAScript 표준 라이브러리를 구현합니다. `Array`, `String`, `Object`, `Math`, `JSON`, `Date`, `RegExp`, `Map`, `Set`, `Promise`, `Proxy`, `Reflect`, `Symbol`, `BigInt`, `TypedArray`, `Temporal`, `Intl`, 제너레이터, 비동기 이터레이터, 모듈을 지원합니다.
- 실제 JS 라이브러리가 사전 확인하는 **Web Platform** API를 제공합니다. `URL`, `URLSearchParams`, `TextEncoder`/`TextDecoder`, `atob`/`btoa`, `structuredClone`, `performance`, `DOMException`을 지원합니다. 전체 기능은 [웹 API](https://phasis.inline0.dev/ko/docs/compatibility/web-apis)를 참조하세요.
- 전체 Fetch 제품군을 갖춘 **`fetch`** 를 제공합니다. `Request`, `Response`, `Headers`, 본문 소비자, `AbortController`/`AbortSignal`, `Blob`, `File`, `FormData`, `EventTarget`/`Event`, 전체 WHATWG Streams(`ReadableStream`, `WritableStream`, `TransformStream`, BYOB, 큐잉 전략)을 포함합니다. 실제 HTTP는 PHP의 `ext-curl`를 통해 바로 작동합니다.
- 전체 `SubtleCrypto`(SHA 계열, HMAC, AES-GCM/CBC/CTR, RSA-OAEP/PSS/PKCS1, ECDSA, ECDH, HKDF, PBKDF2)을 갖춘 **`crypto`**, **`WebSocket`**(RFC 6455 및 교체 가능한 전송 계층), **`XMLHttpRequest`**(동일한 fetch 전송 계층에 기반)을 제공합니다.
- 실제 **이벤트 루프**를 제공합니다. `setTimeout`, `setInterval`, `clearTimeout`, `clearInterval`, `queueMicrotask`와 비동기 경계에서 값 전파를 위한 Stage-3 `AsyncContext`를 지원합니다.
- 구조 분해, 스프레드/레스트, 계산된 프로퍼티, 옵셔널 체이닝, 널 병합, 템플릿 리터럴, 태그 템플릿, 비공개 필드·정적 블록·데코레이터가 포함된 클래스, 최상위 await 등 최신 구문을 지원합니다.
- PHP↔JS 경계를 넘어 값을 변환합니다. 스칼라와 배열은 복사되고, PHP 호출 가능 항목은 JS 함수가 되며, JS 결과는 PHP 스칼라와 배열로 반환됩니다. 정확한 규칙은 [값 변환](https://phasis.inline0.dev/ko/docs/interop/values)을 참조하세요.
- 호스트가 실행을 제어합니다. 호스트가 `fetch` 전송 계층과 정책 훅을 관리하고, 이벤트 루프는 가상 시간으로 실행되며, 고정된 호출 스택 한계가 무한 재귀를 막습니다. 루프 반복 횟수 제한이 있지만 바이트코드 VM이 실행하는 루프에는 아직 적용되지 않습니다. 문자열 길이, 출력 또는 실제 시간 제한은 없습니다. [API: setLimit](https://phasis.inline0.dev/ko/docs/api#setlimit)를 참조하세요.
- Node.js(V8)를 기준으로 검증됩니다. CI는 `main`에 푸시할 때마다, 모든 풀 리퀘스트마다 단위 테스트와 오라클 테스트를 실행합니다. 엔진 소스가 변경되면 Web Platform Tests와 인기 패키지 테스트도 실행합니다. 전체 test262 매트릭스는 수동으로 실행하고 결과 스냅샷을 `COMPAT.md`에 커밋합니다. [호환성](https://phasis.inline0.dev/ko/docs/compatibility)을 참조하세요.

## 해당하지 않는 것

Phasis는 JIT 컴파일러가 아닙니다. 트리 순회 인터프리터와 기회적으로 사용하는 바이트코드 VM으로 구성됩니다. 디스패치에 좌우되는 워크로드에서는 V8보다 실행 시간이 약 100배 늘어날 수 있습니다. 대신 의존성이 없고 순수한 PHP이며 호스트가 실행을 제어합니다. 원시 처리량보다 정확성과 격리가 중요한 PHP 앱에 JavaScript를 임베드하기에 적합합니다.

## 시작하기

- [시작하기](https://phasis.inline0.dev/ko/docs/getting-started) — 설치하고 첫 스크립트를 실행합니다.
- [CLI](https://phasis.inline0.dev/ko/docs/cli) — 파일 실행, 소스 평가, AST 출력용 `bin/phasis`.
- [API](https://phasis.inline0.dev/ko/docs/api) — PHP 앱에 `Phasis\Engine`를 임베드합니다.
- [상호 운용](https://phasis.inline0.dev/ko/docs/interop) — PHP 값과 호출 가능 항목을 JavaScript로 전달합니다.
- [호환성](https://phasis.inline0.dev/ko/docs/compatibility) — test262 지원 범위와 구현된 기능.
- [파서](https://phasis.inline0.dev/ko/docs/parser) — JavaScript를 실행하지 않고 타입이 지정된 AST 또는 ESTree로 파싱합니다.
- [포매터](https://phasis.inline0.dev/ko/docs/formatter) — prettier 호환 레이아웃으로 JavaScript, JSON, CSS를 포맷합니다.
- [고급](https://phasis.inline0.dev/ko/docs/advanced) — 아키텍처, 바이트코드 VM, 벤치마크, 오라클 테스트 모델.
