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

PHPのコンパイル

ビルドパイプラインはDockerfileに格納されています。これは元々seanmorris/php-wasmからフォークされたものです。

大まかに言うと、その Dockerfile は次のようになります。

  • 必要な Linux パッケージ(build-essential など)をすべてインストールします。
  • PHP と必要なライブラリ(sqlite3 など)をダウンロードします。
  • いくつかのパッチを適用します。
  • C コンパイラの代替となる Emscripten を使用してすべてをコンパイルします。
  • JavaScript 用の便利な API である php_wasm.c をコンパイルします。
  • 設定に応じて、php.wasm ファイルと 1 つ以上の JavaScript ローダーを出力します。
  • Emscripten のデフォルトの php.js 出力を、追加機能を備えた ESM モジュールに変換します。

各ステップの詳細については、Dockerfile を直接参照してください。

ビル

すべての PHP バージョンをビルドするには、リポジトリのルートでnx recompile-php:all php-wasm-web(またはphp-wasm-node)を実行してください。出力ファイルはpackages/php-wasm/php-web/publicにあります。特定のバージョンをビルドするには、nx recompile-php:all php-wasm-node --PHP_VERSION=8.0 --WITH_JSPI=yes--WITH_JSPI=noで繰り返します)を実行してください。

PHP 拡張機能

PHP は、Dockerfile にリストされているいくつかの拡張機能を使用して構築されています。

zip のような一部の拡張機能は、ビルド中にオン/オフを切り替えることができます。sqlite3 のような拡張機能はハードコードされています。

ハードコードされた拡張機能のいずれかをオフにする必要がある場合は、このリポジトリで問題を報告してください。さらに、このプロジェクトには貢献者が必要です。PR を開いて必要な変更を投稿していただければ幸いです。

JavaScript に公開された C API

JavaScript に公開されている C API はphp_wasm.cファイルにあります。最も重要な関数は以下のとおりです。

  • void phpwasm_init() – 新しい PHP コンテキストを作成します。 PHP コードを実行する前に必ず呼び出してください。
  • int phpwasm_run(char *code) – PHP スクリプトを実行し、出力を /tmp/stdout と /tmp/stderr に書き込みます。終了コードを返します。
  • void phpwasm_refresh() – 現在の PHP コンテキストを破棄し、新しいコンテキストを開始します。PHP スクリプトを1つ実行した後、次のスクリプトを実行する前に呼び出してください。

詳細については、php_wasm.c のインラインドキュメントを参照してください。

ビルド構成

ビルドはDocker --build-arg機能を介して設定できます。build.jsスクリプトを通じて設定できます。以下のコマンドを実行すると使用方法が表示されます。

nx recompile-php php-wasm-web

サポートされているビルド オプション:

  • PHP_VERSION – ビルドする PHP バージョン。デフォルト: 8.0.24PHP- をプレフィックスとして指定する場合、この値は https://github.com/php/php-src.git リポジトリの既存のブランチを指している必要があります。例えば、7.4.0PHP-7.4.0 ブランチが存在するため有効ですが、7 のみは PHP-7 ブランチが存在しないため無効です。動作が確認されている PHP バージョンは 7.4.*8.0.* です。他のバージョンも動作する可能性はありますが、まだ試していません。
  • EMSCRIPTEN_ENVIRONMENTweb または node。デフォルト: web。ビルド対象のプラットフォーム。web 用にビルドする場合、php-web.jsphp-webworker.js という 2 つの JavaScript ローダーが作成されます。 Node.js 用にビルドする場合、php-node.js というローダーが 1 つだけ作成されます。
  • WITH_LIBXMLyes または no、デフォルト: nolibxml2domxmlsimplexml PHP 拡張モジュール (DOMDocumentSimpleXML など) を使用してビルドするかどうかを指定します。
  • WITH_LIBZIPyes または no、デフォルト: yeszliblibzipzip PHP 拡張モジュール (ZipArchive) を使用してビルドするかどうかを指定します。
  • WITH_NODEFSyes または no、デフォルト: noEmscripten の NODEFS JavaScript ライブラリ を含めるかどうか。これは、Node.js から php.wasm を実行する際に、ローカルファイルシステムからファイルを読み込み、ディレクトリをマウントするのに便利です。