5P by xguru 5일전 | ★ favorite | 댓글 3개
  • Node.js 애플리케이션 내에서 PHP 애플리케이션을 동일 프로세스에서 실행하여, 네트워크 연결 없이 Node.js와 PHP 간 통신을 가능하게 하는 모듈
    • 양방향 통신, 하이브리드 아키텍처, 레거시 PHP 자산 활용 및 마이그레이션 등이 쉬워짐
    • 이를 통해 WordPress를 Next.js 프론트엔드와 통합하는 등 다양한 하이브리드 웹앱 아키텍처를 구현할 수 있음
  • 비동기 방식(handleRequest)동기 방식(handleRequestSync) 모두 지원(동기 방식은 Node.js 스레드 블로킹)
  • x64 Linux, x64/arm64 macOS 환경을 우선 지원하며, 일부 PHP 관련 시스템 라이브러리 설치 필요
  • Request/Response/Headers 등 HTTP 객체를 Node.js에서 직접 생성/조작하여 PHP 애플리케이션과 자연스럽게 연동 가능함
  • 사용방법
    // `Php` 인스턴스 생성 후 `handleRequest()`로 PHP 요청 처리  
    // `Request`, `Response` 객체를 활용해 직접 HTTP 요청/응답 데이터를 다룸  
    import { Php, Request } from '@platformatic/php-node'  
    
    const php = new Php()  
    const request = new Request({  
      url: 'http://example.com/foo/bar',  
      headers: { 'X-Test': ['Hello, from Node.js!'] }  
    })  
    const response = await php.handleRequest(request)  
    console.log(response.body.toString())  
    
  • 활용 예
    • PHP 기반 CMS(WordPress 등)를 Node.js(Next.js 등) 프론트엔드와 통합하거나, 레거시 PHP 앱을 점진적으로 Node.js로 마이그레이션
    • 두 환경 간 네트워크 오버헤드 없이 메모리 내 통신 구현 및 API 게이트웨이, SSR, 커스텀 백엔드 연동 등에 적합
  • API들
    • Php 클래스
      • new Php(config): docroot 등 설정 포함 가능
      • php.handleRequest(request): 비동기 요청 처리(Promise 반환)
      • php.handleRequestSync(request): 동기 처리(스레드 블로킹)
    • Request 클래스
      • HTTP method, url, headers, body 지정 가능
      • 각 속성 직접 접근 가능(예: request.method, request.body)
    • Response 클래스
      • status, headers, body, log 등 속성 보유
      • 수동 생성 가능(테스트, 에러 처리에 활용)
    • Headers 클래스
      • set, add, get, getAll, has, delete 등 다양한 HTTP 헤더 관리 메서드 지원
      • entries, keys, values, forEach 등 반복자 API로 헤더 일괄 처리 가능

그리 매력적인 옵션은 아니네요...

PHP가 기본적으로 먹는 메모리 크기도 꽤 큰 편이고, 초기화 비용도 꽤 비싼 편이라 적절한 관리가 꼭 필요한데,
node랑 같은 프로세스 안에서, 특히 지금 구현과 같이 네이티브 모듈에 PHP를 통째로 담아둔 구조에선 부담이 많이 커 보이네요.

저라면 그냥 php-fpm은 별도의 프로세스로 두고,
차라리 fastcgi 클라이언트를 js로 작성해 처리할 것 같습니다.

이 라이브러리가 AWS Lambda의 Node.js 런타임과 잘 호환될까요?

만약 호환된다면, 궁극적으로는 PHP를 AWS Lambda에 서버리스로 구동할 수도 있을 것 같아요

Nodejs와 병행해서 쓸 이유가 없다면 람다에 PHP 런타임을 배포하셔도 됩니다 https://bref.sh