メインコンテンツへスキップ

WebAssembly PHP

WordPress Playground は、Emscripten専用パイプライン を使用して PHP インタープリター を WebAssembly にビルドします。

Building C programs to WebAssembly

PHP から WebAssembly へのビルドは、通常の PHP のビルドと非常に似ています。wasm ビルドでは、ここで関数シグネチャを調整するそこで設定変数を強制するいくつかの小さなパッチ がありますが、調整が必要な箇所は比較的少ないです。

Building PHP to WebAssembly

しかし、PHP の標準ビルドはブラウザではあまり役に立ちません。サーバーソフトウェアである PHP には、リクエストボディを渡したり、ファイルをアップロードしたり、php://stdinストリームにデータを入力したりするためのJavaScript API がありません。WordPress Playground では、これをゼロから構築する必要がありました。 WebAssembly バイナリには、C で記述された 専用の PHP API モジュール と、writeFile() や run() などのメソッドを公開する JavaScript PHP クラス が付属しています。

PHP のバージョンはすべて静的な.wasm ファイルなので、PHP バージョンスイッチャーは実はかなり退屈です。ブラウザに、例えばphp_8_2.wasmではなくphp_7_3.wasmをダウンロードするように指示するだけです。

Building different versions of PHP to WebAssembly

ネットワークサポートはプラットフォームによって異なります

ネットワークに関しては、WebAssembly プログラムは JavaScript API の呼び出しに制限されています。これは安全機能ではありますが、課題も生じます。PHP で使用される低レベルの同期ネットワークコードを、JavaScript で利用可能な高レベルの非同期 API でどのようにサポートするのでしょうか?

Node.js では、WebSocket から TCP ソケットへのプロキシであるAsyncifyと、php_select のような PHP 内部の深い部分へのパッチ適用が解決策となります。複雑ではありますが、そのメリットはあります。Node.js 向けの PHP ビルドでは、Web API のリクエスト、Composer パッケージのインストール、さらには MySQL サーバーへの接続も可能です。

ブラウザでは、ネットワークは次の 2 つの方法でサポートされます。

  • wp_safe_remote_get 用の高速トランスポートで、これを fetch() 呼び出しに変換します。
  • その他すべてのネットワーク呼び出し用の低速トランスポートで、PHP によって開始された TLS 伝送を解析 し、それを fetch() 呼び出しに変換します。