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
1.9k
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
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
3k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
4
1.2k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
4.5k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
13
11k
Laravel Collectionの計算量を調べてみた2023/laravel_collection_time_complexity_2023
hanhan1978
0
790
PHP で学ぶ Cache の距離の話 / study_cache_with_php
hanhan1978
7
1.8k
Laravel を低速化する技術 / how to slow laravel
hanhan1978
1
3k
俺の Laravel がこんなに速いわけがない! / My Laravel Too Fast
hanhan1978
0
1.5k
カンファレンスで登壇するとどうなるのか? / PHPTechCafe PHPerKaigi 2022
hanhan1978
3
380
Other Decks in Technology
See All in Technology
KTC_DBRE.pdf
_awache
0
290
私のRSpecの書き方 / How I write RSpec
tmtms
4
820
大規模データとの戦い方
knih
1
460
ビジネスとコード品質の接合点 そしてコード品質がそこに及ぼす影響 / The Intersections of Business and Engineering, and The Impact of Code Quality There
mtx2s
10
1k
技術広報として2023年度に頑張ったこと / What we did well in FY2023 as a DevRel
pauli
5
460
Evolutionary Optimization of Model Merging Recipes
fuyu_quant0
3
520
継続的テストモデルを実現するためにスリーアミーゴスを用いた10Xでのシフトレフトの事例
nihonbuson
3
160
MongoDB Atlas Vectorsearchではじめる生成AIアプリ開発
chie8842
3
510
オブジェクト指向CSSが叶えたかったことと、CSSのいま / The aims of Object-oriented CSS and the current state of CSS usage
shinkufencer
11
3.6k
TCA入門したてなので、自分が馴染みのある実装と比較しながらキャッチアップしてみる
fumiyasac0921
1
370
技術広報経験0のEMがエンジニアブランディングをはじめてみた
coconala_engineer
1
130
プッシュ型子育てサービスを、先行プロジェクト実施自治体において開始します
govtechtokyo
0
250
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
35
2.4k
GraphQLとの向き合い方2022年版
quramy
28
12k
Bootstrapping a Software Product
garrettdimon
PRO
302
110k
Fireside Chat
paigeccino
19
2.6k
What's in a price? How to price your products and services
michaelherold
236
11k
10 Git Anti Patterns You Should be Aware of
lemiorhan
644
57k
Designing for humans not robots
tammielis
247
25k
Bash Introduction
62gerente
604
210k
Fashionably flexible responsive web design (full day workshop)
malarkey
397
65k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
153
14k
[RailsConf 2023] Rails as a piece of cake
palkan
21
3.8k
How GitHub Uses GitHub to Build GitHub
holman
467
290k
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は楽しい!