$30 off During Our Annual Pro Sale. View Details »

令和時代の PHP Extension の 作り方 〜 FFI を添えて〜

COLOPL Inc.
October 11, 2023

令和時代の PHP Extension の 作り方 〜 FFI を添えて〜

COLOPL Inc.

October 11, 2023
Tweet

More Decks by COLOPL Inc.

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  5. 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 の機能を拡張する仕組み

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  12. 実演
    How to Extension 開発 - Pskel
    12

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide