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