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
PHP7.4のFFIについて / About PHP-FFI
Search
Ryo Tomidokoro
November 27, 2019
Technology
2
2.7k
PHP7.4のFFIについて / About PHP-FFI
PHP-FFI Foreign Function Interfaceについてまとめました。
Ryo Tomidokoro
November 27, 2019
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
どうすると生き残れないのか/how-not-to-survive
hanhan1978
17
13k
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
110
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
2.4k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
48k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
10k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.9k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
5.1k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
13
5.9k
Other Decks in Technology
See All in Technology
バクラクの認証基盤の成長と現在地 / bakuraku-authn-platform
convto
4
820
営業向け誰でも話せるOCIセールストーク
oracle4engineer
PRO
2
130
React ABC Questions
hirotomoyamada
0
580
エンジニアリングで組織のアウトカムを最速で最大化する!
ham0215
1
260
Goの組織でバックエンドTypeScriptを採用してどうだったか / How was adopting backend TypeScript in a Golang company
kaminashi
12
8.9k
AIコーディングの最前線 〜活用のコツと課題〜
pharma_x_tech
4
2.8k
3月のAWSアップデートを5分間でざっくりと!
kubomasataka
0
130
グループ ポリシー再確認 (2)
murachiakira
0
160
CodePipelineのアクション統合から学ぶAWS CDKの抽象化技術 / codepipeline-actions-cdk-abstraction
gotok365
5
330
生成AIによるCloud Native基盤構築の可能性と実践的ガードレールの敷設について
nwiizo
7
1.3k
4/17/25 - CIJUG - Java Meets AI: Build LLM-Powered Apps with LangChain4j (part 2)
edeandrea
PRO
0
140
SDカードフォレンジック
su3158
1
660
Featured
See All Featured
BBQ
matthewcrist
88
9.6k
Adopting Sorbet at Scale
ufuk
76
9.3k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Navigating Team Friction
lara
185
15k
RailsConf 2023
tenderlove
30
1.1k
Code Reviewing Like a Champion
maltzj
523
40k
Making Projects Easy
brettharned
116
6.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
34
2.2k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
13
810
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
The Invisible Side of Design
smashingmag
299
50k
Faster Mobile Websites
deanohume
306
31k
Transcript
PHP7.4のFFIについて Ryo Tomidokoro PHP勉強会 2019/11/27 @hanhan1978
FFIとは
Foreign Function Interface ↓ あるプログラミング言語から 他のプログラミング言語をコールする仕組
PHP以外の言語にもある
Perl FFI Ruby FFI Java JNI (Java Native Interface)
FFIという単語自体は 特定プログラミング言語の呼び出しを意図しない ↓ PHP FFIは何ができる?
[引用] PHP FFI Introduction - Manual https://www.php.net/manual/en/intro.ffi.php
PHP-FFIは、Cの共有ライブラリをloadして Cの関数、データ構造にアクセス出来る -> と書いてある FFIというよりPNIという方が誤解が無さそう...
現状では、PHPを自前でコンパイルする以外に使う方法無し -> --with-ffi オプションを指定 -> Linuxでは libffi-devが必要 インストール
Hello World
Macの場合は... libc.dylib で動く...多分
これが一体何の役に立つのか?
これまでのPHPでは... extensionを作る以外になかった ↓ FFIがあれば、PHPから直接コールできる!!
例えば OpenCV
https://github.com/vdechenaux/PhpWebcam
IoTでもPHP gpio拡張ではなく ネイティブのライブラリをそのまま利用 PHPで無理すんなという話もあるが...
例えば GTK
http://gtk.php.net/
それ以外の活用法
計算量の多いPHPのプログラム ↓ FFI経由の呼び出しにすることで高速化
https://blog.hanhans.net/2019/10/15/php-ffi/
いわゆるCPUバウンドな処理は効果大 DB接続などのIOが多い場合は効果が薄い ↓ PHP8ではPHP自体がJITコンパイル この最適化は無闇に依存関係を増やしているだけかも
私的な結論
あくまでも実験的な機能 仕事で使おうと考えない方が良いと思う。 ↓ 趣味のIoTや、言語自体の中身を深堀するなどの 研究的な用途としては非常に面白い。
まさに今、CPU負荷に困っていて ピンポイントに適用できそう!という野心的な方 ↓ 試すこと自体は気軽にできるので Let’s Try
そんな挑戦者に贈る
https://github.com/hanhan1978/php-ffi-samples C, Goを使ったサンプル集
PHP-FFIは、ネイティブライブラリとのIFとして FFI\CData を使用 GoでCGOを使う場合でも IFはCに合わせた方が上手くいきやすい。 GoのSliceとかは、特殊な構造体に変換されるので難しい。 PHP-FFIのコツ
FFIの呼び出し処理は、FFI\CDataも含めて、同一スコープ 内でやりきること 例えば、FFI\CDataを別Scopeで作成しても、参照先のポイ ンターがNullになってしまう。 PHP-FFIのコツ2
後半
PHP-FFIのことは、ざっくり分かった。 ↓ もっと深く!PHP-FFIの中身を見たい!(はず)
https://blog.hanhans.net/2019/10/30/gdb-ffi/
Linuxでは libffi を使う 1. dlopenで共有ライブラリをオープン 2. dlsymで実行したい関数のポインタを取得 3. ffi_prep_cifでffi_cif構造体を作成 4.
ffi_callで関数を実行 ざっとまとめると
字面だけでは分かりにくい
PHP-FFIがやっていることを簡潔にCで記述
FFIは楽しい!