Upgrade to Pro — share decks privately, control downloads, hide ads and more …

怖くない!ゼロから始めるPHPソースコードコンパイル入門

COLOPL Inc.
December 22, 2024

 怖くない!ゼロから始めるPHPソースコードコンパイル入門

COLOPL Inc.

December 22, 2024
Tweet

More Decks by COLOPL Inc.

Other Decks in Technology

Transcript

  1. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    株式会社コロプラ 技術基盤本部 工藤 剛 怖くない!ゼロから始める PHPソースコードコンパイル入門 2024.12.22
  2. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    名前: 工藤 剛 (a.k.a. zeriyoshi / ぜり) 所属: 株式会社コロプラ 部署: 技術基盤本部 第2バックエンドエンジニア部 サーバー基盤グループ PEチーム 2017 年新卒入社 最終面接で意気込みを聞かれ「コロプラの PHP をすべて Node.js に変える」と豪語し、2022 年に ext-random で PHP のコミッタになった (?) Platform Engineer として活動中 最近はちょっと低レイヤ周りとかをやっている気がする 自己紹介
  3. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    コロプラのフィロソフィー Vision 行動指針 エンターテインメントで日常をより楽しく、より素晴らしく Mission
  4. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    PHP とは • Hypertext Preprocessor (...2024 年においては) オープンソースのプログラミング言語の一つ
  5. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    オープンソースであるということ 今回はあくまでも ソースコードが公開されていて 自分で好きにビルドして利用できる という部分のみに着目します。 細やかな定義はいろいろありますが、それだけで登壇ネタになるくらいなので ここでは省略! (とても面白いのでぜひ各自調べてみてください)
  6. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    再現しやすいようコンテナ上の Debian 12 (bookworm) でやります パッケージリストの更新と必要なコマンドのインストール PHP のソースコードを取得して /usr/src/php に展開 (例では PHP 8.4.1) # mkdir -p "/usr/src/php" # curl -sSL "https://www.php.net/distributions/php-8.4.2.tar.gz" \ | tar xzvf - -C "/usr/src/php" --strip-components=1 ソースの取得と展開 $ docker run --rm -it debian:bookworm ↑ おすすめ # apt-get update && apt-get install -y "tar" "curl" 正式リリース版の PHP ソースコードアーカイブは公式サイトからダウンロードできます https://www.php.net/downloads.php Note
  7. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    PHP は Unix 系の各種プロジェクトのように Autoconf で構成されているので 構成スクリプト (configure) をオプションなしで実行してみる エラーになってしまった! # ./configure ~~~ 省略 ~~~ configure: error: in '/usr/src/php': configure: error: no acceptable C compiler found in $PATH See 'config.log' for more details とりあえずビルドしようとしてみる メッセージの通り、より詳細なログは config.log として出力されています 複雑なビルドオプションを指定した場合などにはどこでエラーになっているか調査するときに便利です Note ./configure スクリプトを利用 (Autotools) するソフトはだいたい似た動作をします Note
  8. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    エラーメッセージを読んでリトライ エラー時はまずエラーメッセージを読んでみる👀 「$PATH に利用可能な C コンパイラが見つからなかった」 とりあえず GCC を入れて再トライ! 「pkg-config がないか古すぎる」 入れて再トライ! (くりかえし)... configure: error: no acceptable C compiler found in $PATH # apt-get install -y "gcc" # ./configure configure: error: in '/usr/src/php': configure: error: The pkg-config script could not be found or is too old. Make sure it
  9. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    必要なパッケージのインストール Debian 12 (bookworm) では最低限以下のパッケージをインストールすれば OK • gcc : C 言語コンパイラ, PHP は C99 標準のコンパイラに対応 • pkg-config : 依存するライブラリを管理してくれるやつ        libxml2 や libsqlite3 などの解決に使われる • libxml2-dev : XML を操作するためのライブラリ, PHP に組み込む必要が         あるので -dev の方が必要 • libsqlite3-dev : SQLite のライブラリ, PHP に組み込む必要があるので           -dev の方が必要 • make : Makefile を実行するためのコマンド, ./configure はビルド用の     Makefile を生成するので最終的なビルドに必要 # apt-get install -y "gcc" "pkg-config" "libxml2-dev" "libsqlite3-dev" "make"
  10. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    まずビルドして動かす 🎉あなただけの PHP ができた🎉 # ./configure ~~~ 省略 ~~~ Thank you for using PHP. # make -j"$(nproc)" ~~~ 省略 ~~~ Build complete. Don't forget to run 'make test'. # ./sapi/cli/php -v PHP 8.4.1 (cli) (built: Nov 29 2024 07:37:41) (NTS) Copyright (c) The PHP Group Zend Engine v4.4.1, Copyright (c) Zend Technologies ./sapi/cli/php の cli って何? PHP は実行形態ごとに SAPI (Server API) として区別されており、この場合は CLI (Command Line Interface) を指します。 ./sapi/cgi/php-cgi には CGI 版があるはずです Note
  11. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    ./configure をひもとく ビルド構成を変更するには ./configure のオプションを使います 利用可能なオプションは ./configure --help で一覧表示可能👀 一部の機能はコンパイル時に有効化しないと面倒なことに (mysqlnd 等) Docker Library の Dockerfile が参考になる https://github.com/docker-library/php 常に有効にしたい拡張機能は事前に組み込んでおくと 若干の高速化が見込める場合があります 逆に必要ない拡張機能を無効化すればバイナリサイズを 削減できます Note
  12. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    サードパーティ拡張機能を組み込む 競合が起きないものであれば、サードパーティの拡張機能も PHP 本体に 組み込むことができる colopl_bc を組み込む例: # apt-get install -y "git" "autoconf" "bison" "re2c" # git clone --depth=1 --branch="11.0.4" \ "https://github.com/colopl/php-colopl_bc.git" \ "/tmp/colopl_bc" # cp -r "/tmp/colopl_bc/ext" "/usr/src/php/ext/colopl_bc" # cd "/usr/src/php" # ./buildconf --force # ./configure --enable-colopl_bc # make -j"$(nproc)" # ./sapi/cli/php -m | grep "colopl_bc" colopl_bc 拡張を組み込むため buildconf を用いて configure を再生成 configure の生成のために autoconf, bison, re2c が必要 Note ext/ 以下に拡張を置くことで ./configure に --enable-拡張名 オプションが追加される ./configure --help で確認可能 Note
  13. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    PHP は C99 (C 言語の標準規格) に準拠しており、 C99 に対応する コンパイラであれば (基本的に) コンパイルできる gcc の代わりに clang でコンパイルしてみる: # apt-get install -y "clang" # cd "/usr/src/php" # CC="$(which "clang")" CXX="$(which "clang++")" ./configure # make -j"$(nproc)" # strings ./sapi/cli/php | grep "clang" | head -n1 Debian clang version 14.0.6 コンパイラを変えてみる PHP は現状 gcc 拡張である GRV (Global Register Variables) を利用しており、 clang では実行効率が悪化します。 clang は現状、最新の開発版でも GRV に対応していません。 例: ./sapi/cli/php "Zend/bench.php" gcc: 0.196 clang: 0.385 (M3 Pro 11C (5P + 6E) / RAM 36GB / OrbStack 1.9.0) Note コンパイラは ./configure 時に 環境変数で指定します • CC : C コンパイラ • CXX : C++ コンパイラ Note
  14. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    コンパイルオプションを変えてみる 自家ビルドの PHP ならコンパイラオプションを変えることもできる! 環境: Google Cloud - GCE c3-standard-8 (Intel Sapphire Rapids) # ./configure && make clean && make -j"$(nproc)" # ./sapi/cli/php ./Zend/bench.php simple 0.007 simplecall 0.003 simpleucall 0.008 simpleudcall 0.009 mandel 0.061 mandel2 0.062 ackermann(7) 0.012 ary(50000) 0.002 ary2(50000) 0.001 ary3(2000) 0.019 fibo(30) 0.035 hash1(50000) 0.003 hash2(500) 0.004 heapsort(20000) 0.014 matrix(20) 0.012 nestedloop(12) 0.014 sieve(30) 0.007 strcat(200000) 0.002 ------------------------ Total 0.275 # CFLAGS="-O3 -mno-avx2 -mno-avx512f" \ CPPFLAGS="-O3 -mno-avx2 -mno-avx512f" \ ./configure && make clean && make -j"$(nproc)" # ./sapi/cli/php ./Zend/bench.php simple 0.007 simplecall 0.003 simpleucall 0.009 simpleudcall 0.009 mandel 0.056 mandel2 0.056 ackermann(7) 0.012 ary(50000) 0.002 ary2(50000) 0.001 ary3(2000) 0.018 fibo(30) 0.035 hash1(50000) 0.003 hash2(500) 0.005 heapsort(20000) 0.014 matrix(20) 0.011 nestedloop(12) 0.013 sieve(30) 0.007 strcat(200000) 0.003 ------------------------ Total 0.265 Intel CPU は AVX2, AVX-512 等の 一部 SIMD 拡張命令を実行すると 保護のため動作クロックが下がる 場合があり、高速化よりも他の 命令の速度低下によって効率が 悪化する事があります 例では -mno-avx2 で明示的に 無効化し利用しないように しています (最近は改善傾向あり ) Note コンパイラ同様に 環境変数で指定 • CFLAGS : C 言語のフラグ • CPPFLAGS : C++ のフラグ リンカは LDFLAGS (今回は未使用) Note
  15. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    PHP をデバッグビルドする PHP 本体のバグ (SEGV 等) を報告する時などはデバッグビルドをするのが便利 コンパイル時最適化の無効化 & 内部アサーション有効化等でコアダンプや スタックトレースが解析しやすくなる # ./configure --enable-debug \ && make clean \ && make -j"$(nproc)" # ./sapi/cli/php -v PHP 8.4.1 (cli) (built: Nov 29 2024 09:52:56) (NTS DEBUG) Copyright (c) The PHP Group Zend Engine v4.4.1, Copyright (c) Zend Technologies コンパイラの最適化が原因のバグの場合、デバッグビルドでは再現しない場合があります 何にせよデバッグビルドすることで原因の特定が一歩前に進むため、バグ報告を行う場合は デバッグビルドした PHP で再現することでより迅速に修正される (できる) かも Note
  16. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    おまけ: PHP 8.4 のビルド情報を使ってみる PHP 8.4.x からビルド時に環境変数でビルドに関する情報を埋め込むことが できるようになった DockerHub の PHP でもすでに利用中 # PHP_BUILD_PROVIDER="COLOPL (Release 20241222)" ./configure # make clean && make -j"$(nproc)" # ./sapi/cli/php -v PHP 8.4.1 (cli) (built: Nov 29 2024 10:06:15) (NTS) Copyright (c) The PHP Group Built by COLOPL (Release 20241222) Zend Engine v4.4.1, Copyright (c) Zend Technologies $ docker run --rm -it php:8.4-cli -v PHP 8.4.1 (cli) (built: Dec 3 2024 02:59:23) (NTS) Copyright (c) The PHP Group Built by https://github.com/docker-library/php Zend Engine v4.4.1, Copyright (c) Zend Technologies
  17. ©COLOPL, Inc. PHP Conference Japan 2024 - #phpcon #phpcon2024 #track2

    あなたも 良き PHP ビルドライフを!