このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。

このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。

このページはコミュニティによって翻訳されたもので、最新ではない可能性があります。参照用のバージョンをご覧ください。

提供
静的ビルドの作成

静的ビルドの作成

PHPライブラリのローカルインストールを使用する代わりに、 素晴らしいstatic-php-cli プロジェクトのおかげで、FrankenPHPの静的またはほぼ静的なビルドを作成することが可能です(プロジェクト名に「CLI」とありますが、CLIだけでなく全てのSAPIをサポートしています)。

この方法を使えば、PHPインタープリター、Caddy Webサーバー、FrankenPHPをすべて含んだ単一でポータブルなバイナリを作成できます!

完全に静的なネイティブ実行ファイルは依存関係を全く必要とせず、scratch Dockerイメージ上でも実行可能です。 ただし、動的PHP拡張モジュール(Xdebugなど)をロードできず、musl libcを使用しているため、いくつかの制限があります。

ほぼ静的なバイナリはglibcのみを必要とし、動的拡張モジュールをロードできます。

可能であれば、glibcベースのほぼ静的ビルドの使用をお勧めします。

また、FrankenPHPは静的バイナリへのPHPアプリの埋め込みもサポートしています。

# Linux

静的なLinuxバイナリをビルドするためのDockerイメージを提供しています:

# muslベースの完全静的ビルド

依存関係なしにあらゆる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

# glibcベースのほぼ静的なビルド(動的拡張モジュールのサポートあり)

選択した拡張モジュールを静的にコンパイルしながら、さらに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拡張モジュール

デフォルトでは、よく使われる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モジュール

追加の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トークン

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

macOS用の静的バイナリを作成するには以下のスクリプトを実行してください(Homebrewがインストールされている必要があります):

git clone https://github.com/php/frankenphp
cd frankenphp
./build-static.sh

なお、このスクリプトはLinux(おそらく他のUnix系OS)でも動作し、私たちが提供するDockerイメージ内部でも使用されています。

Apple Silicon向けにのみmacOSバイナリを公開しています。Intel Macでは、このスクリプトを使用してソースからビルドしてください。

# FrankenPHP静的ビルドのカスタマイズ

以下の環境変数を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を設定してください。

# 静的バイナリでPHP拡張モジュールを動的にロードする

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がロードされます。

このページを編集