Slide 1

Slide 1 text

令和時代の PHP Extension の 作り方 〜 FFI を添えて〜 株式会社コロプラ 技術基盤本部 サーバー基盤チーム 工藤 剛 1

Slide 2

Slide 2 text

アジェンダ 2 1. 自己紹介 2. PHP Extension とは 3. PHP 7.4 の FFI とは 4. How to Extension 開発 ○ PHPT によるテスト ○ Valgrind によるメモリチェック ○ LLVM Sanitizer によるチェック

Slide 3

Slide 3 text

工藤 剛 技術基盤本部 第3バックエンドエンジニア部 サーバー基盤グループ PEチーム 2017 年新卒入社 運用タイトルのサーバーサイドエンジニアを経験後 SRE に その後は PE として全社共通部分などの開発、導入などを担当 PHP 8.2 の ext-random とか作ったり X (formerly Twitter): @zeriyoshi Mastodon: @[email protected] 3 氏名  : 部署名 : 自己紹介

Slide 4

Slide 4 text

PHP の実行エンジンを拡張し、機能を提供する仕組み 組み込みの関数・クラスなどの多くも PHP Extension PHP Extension とは 4

Slide 5

Slide 5 text

Zend Extension PHP Extension PHP FFI PHP Library 記述言語 C *1 C *1 PHP + C *2 PHP 実行形態 ネイティブ ネイティブ ハイブリッド Zend VM 拡張性 ほぼ何でも 広い 広い 言語の範囲内 開発難度 非常に高い 高い 中程度 低い 導入難度 高い 高い 非常に高い 低い PHP Extension とは 5 *1: C ABI (PHP ABI) に準拠したバイナリを出力可能なもの *2: FFI で呼び出した先はネイティブ, それ以外は Zend VM または ext-ffi で実行 主要な PHP の機能を拡張する仕組み

Slide 6

Slide 6 text

PHP 7.4 の FFI とは 6 PHP 7.4 から導入された C ABI のライブラリを 利用できるようにする PHP Extension (ext-ffi) Extension を作らずともネイティブライブラリを利用可能に! …ただし

Slide 7

Slide 7 text

PHP 7.4 の FFI とは 7 動作させるために必要な要件が結構多い! ● ext-ffi PHP Extension が必要 ○ 標準的な PHP 環境には入っていない ○ Linux では libffi が必要 ● 危険なこともできてしまう ○ Z-Engine (ランタイムで実行エンジンに変更を加える) https://github.com/lisachenko/z-engine

Slide 8

Slide 8 text

PHP 7.4 の FFI とは 8 FFI を用いて libc の関数を呼び出してみる

Slide 9

Slide 9 text

開発環境での検証用に使うのは良いが 本番環境に導入は厳しそう... (個人の感想です) PHP 7.4 の FFI とは 9

Slide 10

Slide 10 text

How to Extension 開発 10 PHP 同梱の ext_skel.php が使える が、少々ハードルが高い...

Slide 11

Slide 11 text

How to Extension 開発 11 開発環境含めてすぐ構築できるテンプレートを作成 コンパイラや VSCode の設定済みなので 面倒くさい環境構築ほぼゼロで開発が可能 GitHub Actions による CI も構築済みで すぐ使える (はず) https://github.com/zeriyoshi/pskel

Slide 12

Slide 12 text

実演 How to Extension 開発 - Pskel 12

Slide 13

Slide 13 text

How to Extension 開発 - PHPT によるテスト 13 PHP は本体含め PHPT でテストが書かれている https://qa.php.net/phpt_details.php 最近追加されたドキュメント化されていないディレクティブ ● EXTENSION: 読み込まれていなければスキップ ● XLEAK: テストケースによる leak (Valgrind) を許容

Slide 14

Slide 14 text

How to Extension 開発 - Valgrind によるメモリチェック メモリやスレッド管理の不備を実行時に チェックできるツールチェーン メモリリークや未初期化アクセスなどを 事前に検出可能 run-tests.php を実行する際に -m オプションを指定することで実行可能 14

Slide 15

Slide 15 text

How to Extension 開発 - LLVM Sanitizerによるチェック ※ Pskel では MemorySanitizer のみ Valgrind 同様、メモリリークや未初期化領域へのアクセスを検出可能 Valgrind で見逃すようなものも検出可能なのでかけておくと一層安心できる run-tests.php を実行する際に –msan オプションを指定することで利用可能 15

Slide 16

Slide 16 text

PHP を拡張する機運は FFI の導入や Extension Skeleton の整備で 高まってきている! コードサンプルを交えた具体的な例は COLOPL Tech Blog で後日...! 空き時間はスポンサーブースにもいます! まとめ 16