Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
令和時代の PHP Extension の 作り方 〜 FFI を添えて〜
Search
COLOPL Inc.
October 11, 2023
Technology
0
1.6k
令和時代の PHP Extension の 作り方 〜 FFI を添えて〜
COLOPL Inc.
October 11, 2023
Tweet
Share
More Decks by COLOPL Inc.
See All by COLOPL Inc.
コロプラのオンボーディングを採用から語りたい
colopl
7
1.8k
怖くない!ゼロから始めるPHPソースコードコンパイル入門
colopl
0
91
大規模トラフィックを支える ゲームバックエンドの課題と構成の変遷 ~安定したゲーム体験を実現するために~
colopl
3
3.9k
長期運用プロジェクトでのMySQLからTiDB移行の検証
colopl
3
1.6k
ゲームを支えるバックエンドエンジニアのリアルを公開!
colopl
1
1.2k
コロプラ_SRE_LCE_ゲームバックエンド_性能との戦い
colopl
0
880
新卒3年目の ゲームバックエンドエンジニアが これまでに経験したこと
colopl
1
1.4k
大規模タイトルを ノーメンテで運用するコツ
colopl
1
1.4k
サーバーサイドエンジニアの ゲーム企画との向き合い方
colopl
1
1.3k
Other Decks in Technology
See All in Technology
実践!OpenTelemetry
oracle4engineer
PRO
0
210
Ask! NIKKEI RAG検索技術の深層
hotchpotch
13
2.7k
プロセス改善による品質向上事例
tomasagi
0
480
トラシューアニマルになろう ~開発者だからこそできる、安定したサービス作りの秘訣~
jacopen
2
560
MC906491 を見据えた Microsoft Entra Connect アップグレード対応
tamaiyutaro
1
380
現場で役立つAPIデザイン
nagix
20
6.6k
EDRからERM: PFN-SIRTが関わるセキュリティとリスクへの取り組み
pfn
PRO
0
160
マルチデータプロダクト開発・運用に耐えるためのデータ組織・アーキテクチャの遷移
mtpooh
1
400
テストアーキテクチャ設計で実現する高品質で高スピードな開発の実践 / Test Architecture Design in Practice
ropqa
3
480
データの品質が低いと何が困るのか
kzykmyzw
6
950
第13回 Data-Centric AI勉強会, 画像認識におけるData-centric AI
ksaito_osx
0
330
Platform Engineeringは自由のめまい
nwiizo
2
800
Featured
See All Featured
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.2k
Designing for humans not robots
tammielis
250
25k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
128
19k
Fireside Chat
paigeccino
34
3.2k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
Building Adaptive Systems
keathley
39
2.4k
The Pragmatic Product Professional
lauravandoore
32
6.4k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
27
1.9k
Code Reviewing Like a Champion
maltzj
521
39k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
Transcript
令和時代の PHP Extension の 作り方 〜 FFI を添えて〜 株式会社コロプラ 技術基盤本部
サーバー基盤チーム 工藤 剛 1
アジェンダ 2 1. 自己紹介 2. PHP Extension とは 3. PHP
7.4 の FFI とは 4. How to Extension 開発 ◦ PHPT によるテスト ◦ Valgrind によるメモリチェック ◦ LLVM Sanitizer によるチェック
工藤 剛 技術基盤本部 第3バックエンドエンジニア部 サーバー基盤グループ PEチーム 2017 年新卒入社 運用タイトルのサーバーサイドエンジニアを経験後 SRE
に その後は PE として全社共通部分などの開発、導入などを担当 PHP 8.2 の ext-random とか作ったり X (formerly Twitter): @zeriyoshi Mastodon: @
[email protected]
3 氏名 : 部署名 : 自己紹介
PHP の実行エンジンを拡張し、機能を提供する仕組み 組み込みの関数・クラスなどの多くも PHP Extension PHP Extension とは 4
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 の機能を拡張する仕組み
PHP 7.4 の FFI とは 6 PHP 7.4 から導入された C
ABI のライブラリを 利用できるようにする PHP Extension (ext-ffi) Extension を作らずともネイティブライブラリを利用可能に! …ただし
PHP 7.4 の FFI とは 7 動作させるために必要な要件が結構多い! • ext-ffi PHP
Extension が必要 ◦ 標準的な PHP 環境には入っていない ◦ Linux では libffi が必要 • 危険なこともできてしまう ◦ Z-Engine (ランタイムで実行エンジンに変更を加える) https://github.com/lisachenko/z-engine
PHP 7.4 の FFI とは 8 FFI を用いて libc の関数を呼び出してみる
開発環境での検証用に使うのは良いが 本番環境に導入は厳しそう... (個人の感想です) PHP 7.4 の FFI とは 9
How to Extension 開発 10 PHP 同梱の ext_skel.php が使える が、少々ハードルが高い...
How to Extension 開発 11 開発環境含めてすぐ構築できるテンプレートを作成 コンパイラや VSCode の設定済みなので 面倒くさい環境構築ほぼゼロで開発が可能
GitHub Actions による CI も構築済みで すぐ使える (はず) https://github.com/zeriyoshi/pskel
実演 How to Extension 開発 - Pskel 12
How to Extension 開発 - PHPT によるテスト 13 PHP は本体含め
PHPT でテストが書かれている https://qa.php.net/phpt_details.php 最近追加されたドキュメント化されていないディレクティブ • EXTENSION: 読み込まれていなければスキップ • XLEAK: テストケースによる leak (Valgrind) を許容
How to Extension 開発 - Valgrind によるメモリチェック メモリやスレッド管理の不備を実行時に チェックできるツールチェーン メモリリークや未初期化アクセスなどを
事前に検出可能 run-tests.php を実行する際に -m オプションを指定することで実行可能 14
How to Extension 開発 - LLVM Sanitizerによるチェック ※ Pskel では
MemorySanitizer のみ Valgrind 同様、メモリリークや未初期化領域へのアクセスを検出可能 Valgrind で見逃すようなものも検出可能なのでかけておくと一層安心できる run-tests.php を実行する際に –msan オプションを指定することで利用可能 15
PHP を拡張する機運は FFI の導入や Extension Skeleton の整備で 高まってきている! コードサンプルを交えた具体的な例は COLOPL
Tech Blog で後日...! 空き時間はスポンサーブースにもいます! まとめ 16