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

PHP Internals わいわい #3 mb_*関数を作ってみよう

PHP Internals わいわい #3 mb_*関数を作ってみよう

本来はPHPカンファレンス2024で発表する予定の資料でしたが、体調不良で参加できなかったため作成しました。

てきめん tekimen

December 22, 2024
Tweet

More Decks by てきめん tekimen

Other Decks in Programming

Transcript

  1. 自己紹介 てきめん • https://tekitoh-memdhoi.info • X: @youkidearitai • https://github.com/youkidearitai •

    PHP 8.4で複数の関数を作りました – mb_trim, mb_ltrim, mb_rtrim – mb_ucfirst, mb_lcfirst – grapheme_str_split オレ
  2. 趣旨 • PHP Internals Bookを元に、PHPのソースコード、php-srcを 取得、コンパイルしたりソースコードを読みます – https://www.phpinternalsbook.com/ – あわよくばバグを見つけたら報告したり

    – あわよくばテストコードを修正したり – 更に行けば関数・機能を追加するとか • PHP Internalに向かって新機能を追加する提案をしたりで きないかと思っています
  3. PHPのコンパイルの準備 > docker pull ubuntu:22.04 > docker run -it ubuntu:22.04

    bash # apt update && apt install -y pkg-config build- essential autoconf bison re2c libxml2-dev libsqlite3-dev gdb git libonig-dev # cd ~ # /root # git clone https://github.com/php/php-src
  4. PHPのコンパイルの準備 # cd php-src # ./buildconf -f # ./configure --enable-debug

    --enable-mbstring # make # make test # make install # --prefix を指定していないので/usr/local/に入る # php -v #これで実行できる!
  5. この状態を保存します • Command + p + qで抜けるか、もしくは別のコンソー ルを開いてください • >

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

    8.4.0-dev (cli) (built: May 31 2024 00:57:46) (NTS DEBUG) Copyright (c) The PHP Group Zend Engine v4.4.0-dev, Copyright (c) Zend Technologies
  7. デバッグ手法 • Linuxではgdbとかlldbなどが使えますが、今回はgdb を使います • コンテナ内部でvimとctagsなどを利用してソースコー ドを読みます – 手元でコンパイルできるとVisual Studio

    Codeがつかえた りするようですね • https://php.github.io/php-src/introduction/ides/visual-studi o-code.html – このあたり知ってる人は共有してくれると嬉しい
  8. 開発環境を揃える # apt install exuberant-ctags vim # cd ~/php-src #

    ctags -R . # カレントディレクトリが/root/php-src
  9. 内部で使える関数 • mb_get_substr – mb_substrの内部実装関数です。 • mb_fast_convert – mb_convert_encodingの内部実装関数です。 •

    mb_fast_convert関数で内部でUTF-32に変換して目的の 文字エンコーディングに変換しています、これがUCS方式