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

PHP Internals わいわい #3 PIEを使ってみよう

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

PHP Internals わいわい #3 PIEを使ってみよう

Avatar for てきめん tekimen

てきめん tekimen PRO

May 07, 2026

More Decks by てきめん tekimen

Other Decks in Programming

Transcript

  1. CPUアーキテクチャを確認しながら、 PHPのコンパイルの準備 > docker pull ubuntu:24.04 > docker run -it

    ubuntu:24.04 bash # uname -a Linux e361ddb8f5c2 5.15.153.1-microsoft-standard-WSL2 #1 SMP Fri Mar 29 23:14:13 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux # それぞれ 違うはず # apt update && apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev gdb git curl libssl-dev sudo file # cd ~ # /root # git clone https://github.com/php/php-src
  2. PHPのコンパイルの準備 # cd php-src # git checkout PHP-8.5 # PHP

    8.5 開発中のブランチ # ./buildconf -f # ./configure --enable-debug --enable-mbstring --disable- mbregex --with-openssl # pieでOpenSSLを使う # make -j`nproc` # -j オプションで並列実行数、``で実行結 果をコマンドに反映、nprocコマンドは実行可能プロセッサー数
  3. ビルドしたバイナリの確認 # file sapi/cli/php sapi/cli/php: ELF 64-bit LSB pie executable,

    x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0df17086899aaadefd53cf7aa87329f219ad75ca, for GNU/Linux 3.2.0, with debug_info, not stripped # make したバイナリは、sapi/ 配下に入ります。CLIはsapi/cli
  4. PHPのインストール # make install # --prefix を指定していないので/usr/local/に入る # cp php.ini-development

    /usr/local/lib/php.ini # php.iniをpieで使うのでphp.iniをコピー # php -v #これで実行できる! # make install で /usr/local にインストールされます。
  5. pieのインストール # curl -fL --output /tmp/pie.phar https://github.com/php/pie/releases/latest/do wnload/pie.phar \ &&

    mv /tmp/pie.phar /usr/local/bin/pie \ && chmod +x /usr/local/bin/pie https://github.com/php/pie#one-liner より、gh attestationを除 いたワンライナー
  6. Xdebugのインストール # pie install xdebug/xdebug PHP Installer for Extensions (PIE)

    1.4.1, from The PHP Foundation 🥧 You are running PHP 8.5.7-dev Target PHP installation: 8.5.7 nts, on Linux/OSX/etc x86_64 (from /usr/local/bin/php) The following build tools are missing: libtoolize/glibtoolize Would you like to install them now? Ok, but things might not work. Just so you know. Found package: xdebug/xdebug:3.5.1 which provides ext-xdebug Extracted xdebug/xdebug:3.5.1 source to: /root/.config/pie/php8.5_832b7da0d0f5a7ca029e13ea95029cc7/vendor/xdebug/xdebug phpize complete. Configure complete with options: --with-php-config=/usr/local/bin/php-config Build complete: /root/.config/pie/php8.5_832b7da0d0f5a7ca029e13ea95029cc7/vendor/xdebug/ xdebug/modules/xdebug.so Install complete: /usr/local/lib/php/extensions/debug-non-zts-20250925/xdebug.so Extension is enabled and loaded in /usr/local/bin/php ✅ # php.iniを/usr/local/lib/ に格納したので、勝手に追記してくれる
  7. PIEって何してるの? Packagist(https://packagist.org) から最新バージョンを取得し、以 下コマンドをまとめたもの # phpize # 次の configue スクリプトを作る

    # ./configure # make # make install # vi /path/to/php.ini # zend_extensionかextensionディレクティ ブを追加する # PackagistにはGitHubへtagを送信(v0.1.0とか)したものを取得 # ただ、今のところ ./configure –prefix=/path/to/dir/ には対応し てないみたい
  8. mb_onigをインストールしてみる • 鬼車がメンテナンス終了したことで、mbregex(mb_ereg系 関数)がPHP 8.6で非推奨、9.0で削除となる – 流石にEOLを抱えたライブラリをphp-srcが持つのは厳しい • 早速FreeBSDは2026年12月にEOL –

    しかし、このインパクトは想像以上にデカい – そこで使えるようにmbregexだけ外部拡張化したのがmb_onig • PHP 8.6時点ではmbregexはあるので--disable-mbregexが必要
  9. mb_onigのインストール root@fb767d780302:/# pie install mb_onig/mb_onig PHP Installer for Extensions (PIE)

    1.4.1, from The PHP Foundation 🥧 You are running PHP 8.5.7-dev Target PHP installation: 8.5.7 nts, on Linux/OSX/etc x86_64 (from /usr/local/bin/php) The following build tools are missing: libtoolize/glibtoolize Would you like to install them now? Ok, but things might not work. Just so you know. Found package: mb_onig/mb_onig:v0.1.5 which provides ext-mb_onig Extracted mb_onig/mb_onig:v0.1.5 source to: /root/.config/pie/php8.5_832b7da0d0f5a7ca029e13ea95029cc7/vendor/mb_onig/mb_onig phpize complete. Configure complete with options: --with-php-config=/usr/local/bin/php-config Build complete: /root/.config/pie/php8.5_832b7da0d0f5a7ca029e13ea95029cc7/vendor/mb_onig/ mb_onig/modules/mb_onig.so Install complete: /usr/local/lib/php/extensions/debug-non-zts-20250925/mb_onig.so Extension is enabled and loaded in /usr/local/bin/php ✅ # php.iniを/usr/local/lib/ に格納したので、勝手に追記してくれる
  10. mb_onigがインストールされてるか確認 # php -m | grep mb_onig mb_onig # php

    -r 'var_dump(function_exists("mb_ereg"));' Command line code:1: bool(true) # ちゃんとmb_eregがあることがわかりますね
  11. mb_onigのソース # git clone https://github.com/youkidearitai/mb_onig # cd mb_onig # ls

    mb_onig.c # mbregexを単体で使えるようにしてる部分 php_mbregex.c # php-srcから取ってきたソース mb_onig.stub.php # php-srcからmbregexだけ取り出したところ composer.json # packagistに上げ、pieでインストールする際に必要 になる
  12. legacy_mbstringのインストール root@fb767d780302:/# pie install legacy_mbstring/mb_detect_encoding PHP Installer for Extensions (PIE)

    1.4.1, from The PHP Foundation 🥧 You are running PHP 8.5.7-dev Target PHP installation: 8.5.7 nts, on Linux/OSX/etc x86_64 (from /usr/local/bin/php) The following build tools are missing: libtoolize/glibtoolize Would you like to install them now? Ok, but things might not work. Just so you know. Found package: legacy_mbstring/mb_detect_encoding:v0.2.1 which provides ext-legacy_mbstring Extracted legacy_mbstring/mb_detect_encoding:v0.2.1 source to: /root/.config/pie/php8.5_832b7da0d0f5a7ca029e13ea95029cc7/vendor/legacy_mbstring/mb_detect_encoding phpize complete. Configure complete with options: --with-php-config=/usr/local/bin/php-config Build complete: /root/.config/pie/php8.5_832b7da0d0f5a7ca029e13ea95029cc7/vendor/legacy_mbstring/ mb_detect_encoding/modules/legacy_mbstring.so Install complete: /usr/local/lib/php/extensions/debug-non-zts-20250925/legacy_mbstring.so Extension is enabled and loaded in /usr/local/bin/php ✅ # php.iniを/usr/local/lib/ に格納したので、勝手に追記してくれる
  13. legacy_mbstringのソース # git clone https://github.com/youkidearitai/legacy_mbstring # cd legacy_mbstring # ls

    libmbfl_php80 # PHP 8.0当時のlibmbfl legacy_mbstring.c # PHP 8.0当時のmb_detect_encodingのコード composer.json # packagistに上げ、pieでインストールする際に必要になる
  14. 試しにやってみる # cd /root/php-src/ext # git clone https://github.com/youkidearitai/legacy_mbstring # cd

    ../ # make clean # ./buildconf -f # ソースコードを加えた場合、configureを作り直す必要あり # ./configure --enable-debug --enable-mbstring --disable-mbregex -- with-openssl --enable-legacy_mbstring # make -j`nproc` make: *** No rule to make target '/root/php-src/ext/mbstring/legacy_mbstring.c', needed by 'ext/mbstring/legacy_mbstring.lo'. Stop. make: *** Waiting for unfinished jobs.... mbstringがターゲットが見つからないと言ってる
  15. config.m4を修正する # cd ext/legacy_mbstring # sed -i 's/PHP_MBSTRING/PHP_LEGACY_MBSTRING/g' config.m4 #

    cd ../../ # ./buildconf -f # ./config.nice # さっきのconfigureが入ってる # make clean # 前にコンパイルしたものは消す # make -j`nproc` /usr/bin/ld: ext/mbstring/libmbfl/nls/nls_uni.o:/root/php-src/ext/mbstring/libmbfl/nls/nls_uni.c:5: multiple definition of `mbfl_language_uni'; ext/legacy_mbstring/libmbfl_php80/nls/nls_uni.o:/root/php-src/ext/legacy_mbstring/ libmbfl_php80/nls/nls_uni.c:5: first defined here 一部抜粋、ldがどっちにすればいいか分かんない! と言ってる
  16. この状態を保存します • Command + p + qで抜けるか、もしくは別のコンソー ルを開いてください • >

    docker ps で開いているContainer IDを調べます • > docker commit [container id] ubuntu:php85 – このようにすればubuntu:php85で今までの作業した内容 を保存して、コンパイルできた状態で入れます
  17. このようにコンテナを作れました > docker run -it ubuntu:php85 root@7c43d60f63a4:~/php-src# php -v PHP

    8.5.7-dev (cli) (built: Apr 23 2026 14:26:40) (NTS DEBUG) Copyright (c) The PHP Group Zend Engine v4.5.7-dev, Copyright (c) Zend Technologies with Xdebug v3.5.1, Copyright (c) 2002-2026, by Derick Rethans with Zend OPcache v8.5.7-dev, Copyright (c), by Zend Technologies