このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。
このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。
このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。
PHPライブラリのローカルインストールを使用する代わりに、 素晴らしいstatic-php-cli プロジェクトのおかげで、FrankenPHPの静的またはほぼ静的なビルドを作成することが可能です(プロジェクト名に「CLI」とありますが、CLIだけでなく全てのSAPIをサポートしています)。
この方法を使えば、PHPインタープリター、Caddy Webサーバー、FrankenPHPをすべて含んだ単一でポータブルなバイナリを作成できます!
完全に静的なネイティブ実行ファイルは依存関係を全く必要とせず、scratch Dockerイメージ上でも実行可能です。
ただし、動的PHP拡張モジュール(Xdebugなど)をロードできず、musl libcを使用しているため、いくつかの制限があります。
ほぼ静的なバイナリはglibcのみを必要とし、動的拡張モジュールをロードできます。
可能であれば、glibcベースのほぼ静的ビルドの使用をお勧めします。
また、FrankenPHPは静的バイナリへのPHPアプリの埋め込みもサポートしています。
静的なLinuxバイナリをビルドするためのDockerイメージを提供しています:
依存関係なしにあらゆるLinuxディストリビューションで動作する完全静的バイナリ(ただし拡張モジュールの動的ロードはサポートしない)を作成するには、以下を実行します:
docker buildx bake --load static-builder-musl
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log dunglas/frankenphp:static-builder-musl
cp "output/frankenphp-linux-$(uname -m)" frankenphp
高い並行性が求められるシナリオでは、より良いパフォーマンスのため、mimallocアロケーターの使用を検討してください。
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log -e MIMALLOC=1 dunglas/frankenphp:static-builder-musl
選択した拡張モジュールを静的にコンパイルしながら、さらにPHP拡張モジュールを動的にロードできるバイナリを作成するには、以下を実行します:
docker buildx bake --load static-builder-gnu
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log dunglas/frankenphp:static-builder-gnu
cp "output/frankenphp-linux-$(uname -m)" frankenphp
このバイナリはglibcバージョン2.28以上をすべてサポートしますが、muslベースシステム(Alpine Linuxなど)では動作しません。
生成されたほぼ静的(glibcを除く)バイナリはfrankenphpという名前で、カレントディレクトリに出力されます。
ビルドが失敗した場合、static-php-cliのログはoutput/log/にあります。
Dockerを使わずに静的バイナリをビルドしたい場合は、macOS向けの手順を参照してください。これらの手順はLinuxでも使用できます。
デフォルトでは、よく使われるPHP拡張モジュールがコンパイルされます。デフォルトの設定はcraft.ymlにあります。
バイナリのサイズを削減したり、攻撃対象領域(アタックサーフェス)を減らすために、PHP_EXTENSIONS変数を使用してビルドする拡張モジュールを指定できます。
例えば、opcacheとpdo_sqlite拡張モジュールのみをビルドするには、以下のように実行します:
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log -e PHP_EXTENSIONS=opcache,pdo_sqlite dunglas/frankenphp:static-builder-musl
# ...
有効にした拡張モジュールに追加機能を持たせるライブラリを追加するには、PHP_EXTENSION_LIBS変数を渡すことができます:
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log \
-e PHP_EXTENSIONS=gd \
-e PHP_EXTENSION_LIBS=libjpeg,libwebp \
dunglas/frankenphp:static-builder-musl
追加のCaddyモジュールを追加したり、xcaddyに他の引数を渡したりするには、XCADDY_ARGS変数を使用します:
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log \
-e XCADDY_ARGS="--with github.com/darkweak/souin/plugins/caddy --with github.com/dunglas/caddy-cbrotli --with github.com/dunglas/mercure/caddy --with github.com/dunglas/vulcain/caddy" \
dunglas/frankenphp:static-builder-musl
この例では、Caddy用のSouinHTTPキャッシュモジュールとcbrotli、Mercure、Vulcainモジュールを追加しています。
Tip
cbrotli、Mercure、Vulcainモジュールは、
XCADDY_ARGSが空または設定されていない場合はデフォルトで含まれます。XCADDY_ARGSの値をカスタマイズする場合、それらを含めたいのであれば明示的に指定する必要があります。
FrankenPHP静的ビルドのカスタマイズも参照してください
GitHub API レート制限に達した場合は、GITHUB_TOKENという名前の環境変数にGitHub Personal Access Tokenを設定してください:
docker run --rm -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log -e GITHUB_TOKEN="xxx" dunglas/frankenphp:static-builder-musl
# ...
macOS用の静的バイナリを作成するには以下のスクリプトを実行してください(Homebrewがインストールされている必要があります):
git clone https://github.com/php/frankenphp
cd frankenphp
./build-static.sh
なお、このスクリプトはLinux(おそらく他のUnix系OS)でも動作し、私たちが提供するDockerイメージ内部でも使用されています。
Apple Silicon向けにのみmacOSバイナリを公開しています。Intel Macでは、このスクリプトを使用してソースからビルドしてください。
以下の環境変数をdocker runやbuild-static.sh
スクリプトに渡すことで、静的ビルドをカスタマイズできます:
FRANKENPHP_VERSION: 使用するFrankenPHPのバージョンPHP_VERSION: 使用するPHPのバージョンPHP_EXTENSIONS: ビルドするPHP拡張(サポートされる拡張のリスト)PHP_EXTENSION_LIBS: 拡張モジュールに追加機能を持たせるためにビルドする追加ライブラリXCADDY_ARGS: 追加のCaddyモジュールを導入するなどxcaddyに渡す引数EMBED: バイナリに埋め込むPHPアプリケーションのパスCLEAN: 指定するとlibphpおよびそのすべての依存関係がスクラッチからビルドされます(キャッシュなし)COMPRESS: 1 に設定すると UPX を使用して結果のバイナリを圧縮します(Linux のみ。DEBUG_SYMBOLS が設定されている場合は無視されます)DEBUG_SYMBOLS: 指定すると、デバッグシンボルが除去されず、バイナリに含まれますMIMALLOC: (実験的、Linuxのみ)パフォーマンス向上のためにmuslのmallocngをmimallocに置き換えます。muslをターゲットとするビルドにのみこれを使用することをお勧めします。glibcの場合は、このオプションを無効にして、代わりにバイナリを実行する際にLD_PRELOADを使用することをお勧めします。RELEASE: (メンテナー用)指定すると、生成されたバイナリがGitHubにアップロードされますLIBC: (Linuxのみ) 完全静的バイナリの場合はmusl(デフォルト)、システムglibcに動的にリンクする場合はgnu。これはstatic-php-cliのSPC_TARGETおよびSPC_TOOLCHAINの短縮形であり、これらは直接設定することもできます。static-php-cliはcraft.ymlを読み込む前にツールチェーンを解決するため、これらは実際の環境変数である必要があります。muslのデフォルトはアーキテクチャのベースラインCPU(x86_64-linux-muslまたはaarch64-linux-musl)をターゲットとするため、バイナリはどのCPUでも実行できます。代わりにビルドマシン用に最適化するにはSPC_TARGET=native-native-muslを設定してください。glibcまたはmacOSベースのバイナリでは、PHP拡張モジュールを動的にロードできます。ただし、これらの拡張はZTSサポートでコンパイルされている必要があります。 ほとんどのパッケージマネージャーは現在、拡張のZTSバージョンを提供していないため、自分でコンパイルする必要があります。
このために、static-builder-gnu Dockerコンテナを実行し、それにリモートで接続して、./configure --with-php-config=/go/src/app/dist/buildroot/bin/php-configで拡張をコンパイルできます。
Xdebug拡張モジュールの場合:
docker buildx bake --load static-builder-gnu
docker run --rm -v "$PWD/dist:/go/src/app/dist" -v "$PWD/output:/output" -e OUTPUT_DIR=/output -e SPC_LOGS_DIR=/output/log dunglas/frankenphp:static-builder-gnu
docker run --rm -it -v "$PWD/dist:/go/src/app/dist" dunglas/frankenphp:static-builder-gnu /bin/bash
cd /go/src/app/dist/buildroot/bin
git clone https://github.com/xdebug/xdebug.git && cd xdebug
../phpize
./configure --with-php-config=/go/src/app/dist/buildroot/bin/php-config
make
exit
cp dist/buildroot/bin/xdebug/modules/xdebug.so xdebug-zts.so
cp "output/frankenphp-linux-$(uname -m)" frankenphp
これにより、現在のディレクトリにfrankenphpとxdebug-zts.soが作成されます。
もしxdebug-zts.soを拡張ディレクトリに移動し、php.iniにzend_extension=xdebug-zts.soを追加してFrankenPHPを実行すると、Xdebugがロードされます。