- Node.jsアプリケーション内でPHPアプリケーションを同一プロセスで実行し、ネットワーク接続なしでNode.jsとPHP間の通信を可能にするモジュール
- 双方向通信、ハイブリッドアーキテクチャ、レガシーPHP資産の活用やマイグレーションが容易になる
- これにより、WordPressをNext.jsフロントエンドと統合するなど、さまざまなハイブリッドWebアプリアーキテクチャを実装できる
- 非同期方式(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へマイグレーションしたりできる
- 2つの環境間でネットワークオーバーヘッドなしのインメモリ通信を実装でき、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でヘッダーを一括処理可能
3件のコメント
あまり魅力的な選択肢ではないですね...
PHPはもともとのメモリ消費量もかなり大きめですし、初期化コストもかなり高いので、適切な管理が必須ですが、
nodeと同じプロセス内で、特に今の実装のようにネイティブモジュールの中にPHPを丸ごと抱え込んだ構造では、負担がかなり大きく見えます。
私なら、php-fpmは別プロセスのままにして、
むしろfastcgiクライアントをjsで書いて処理すると思います。
このライブラリは AWS Lambda の Node.js ランタイムともうまく互換性があるのでしょうか?
もし互換性があるなら、最終的には PHP を AWS Lambda 上でサーバーレスに動かすこともできそうですね
Node.jsと並行して使う理由がないのであれば、LambdaにPHPランタイムをデプロイしても構いません https://bref.sh