PHP7.4のFFIについて / About PHP-FFI
by
Ryo Tomidokoro
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
PHP7.4のFFIについて Ryo Tomidokoro PHP勉強会 2019/11/27 @hanhan1978
Slide 2
Slide 2 text
FFIとは
Slide 3
Slide 3 text
Foreign Function Interface ↓ あるプログラミング言語から 他のプログラミング言語をコールする仕組
Slide 4
Slide 4 text
PHP以外の言語にもある
Slide 5
Slide 5 text
Perl FFI Ruby FFI Java JNI (Java Native Interface)
Slide 6
Slide 6 text
FFIという単語自体は 特定プログラミング言語の呼び出しを意図しない ↓ PHP FFIは何ができる?
Slide 7
Slide 7 text
[引用] PHP FFI Introduction - Manual https://www.php.net/manual/en/intro.ffi.php
Slide 8
Slide 8 text
PHP-FFIは、Cの共有ライブラリをloadして Cの関数、データ構造にアクセス出来る -> と書いてある FFIというよりPNIという方が誤解が無さそう...
Slide 9
Slide 9 text
現状では、PHPを自前でコンパイルする以外に使う方法無し -> --with-ffi オプションを指定 -> Linuxでは libffi-devが必要 インストール
Slide 10
Slide 10 text
Hello World
Slide 11
Slide 11 text
Macの場合は... libc.dylib で動く...多分
Slide 12
Slide 12 text
これが一体何の役に立つのか?
Slide 13
Slide 13 text
これまでのPHPでは... extensionを作る以外になかった ↓ FFIがあれば、PHPから直接コールできる!!
Slide 14
Slide 14 text
例えば OpenCV
Slide 15
Slide 15 text
https://github.com/vdechenaux/PhpWebcam
Slide 16
Slide 16 text
IoTでもPHP gpio拡張ではなく ネイティブのライブラリをそのまま利用 PHPで無理すんなという話もあるが...
Slide 17
Slide 17 text
例えば GTK
Slide 18
Slide 18 text
http://gtk.php.net/
Slide 19
Slide 19 text
それ以外の活用法
Slide 20
Slide 20 text
計算量の多いPHPのプログラム ↓ FFI経由の呼び出しにすることで高速化
Slide 21
Slide 21 text
https://blog.hanhans.net/2019/10/15/php-ffi/
Slide 22
Slide 22 text
いわゆるCPUバウンドな処理は効果大 DB接続などのIOが多い場合は効果が薄い ↓ PHP8ではPHP自体がJITコンパイル この最適化は無闇に依存関係を増やしているだけかも
Slide 23
Slide 23 text
私的な結論
Slide 24
Slide 24 text
あくまでも実験的な機能 仕事で使おうと考えない方が良いと思う。 ↓ 趣味のIoTや、言語自体の中身を深堀するなどの 研究的な用途としては非常に面白い。
Slide 25
Slide 25 text
まさに今、CPU負荷に困っていて ピンポイントに適用できそう!という野心的な方 ↓ 試すこと自体は気軽にできるので Let’s Try
Slide 26
Slide 26 text
そんな挑戦者に贈る
Slide 27
Slide 27 text
https://github.com/hanhan1978/php-ffi-samples C, Goを使ったサンプル集
Slide 28
Slide 28 text
PHP-FFIは、ネイティブライブラリとのIFとして FFI\CData を使用 GoでCGOを使う場合でも IFはCに合わせた方が上手くいきやすい。 GoのSliceとかは、特殊な構造体に変換されるので難しい。 PHP-FFIのコツ
Slide 29
Slide 29 text
FFIの呼び出し処理は、FFI\CDataも含めて、同一スコープ 内でやりきること 例えば、FFI\CDataを別Scopeで作成しても、参照先のポイ ンターがNullになってしまう。 PHP-FFIのコツ2
Slide 30
Slide 30 text
後半
Slide 31
Slide 31 text
PHP-FFIのことは、ざっくり分かった。 ↓ もっと深く!PHP-FFIの中身を見たい!(はず)
Slide 32
Slide 32 text
https://blog.hanhans.net/2019/10/30/gdb-ffi/
Slide 33
Slide 33 text
Linuxでは libffi を使う 1. dlopenで共有ライブラリをオープン 2. dlsymで実行したい関数のポインタを取得 3. ffi_prep_cifでffi_cif構造体を作成 4. ffi_callで関数を実行 ざっとまとめると
Slide 34
Slide 34 text
字面だけでは分かりにくい
Slide 35
Slide 35 text
PHP-FFIがやっていることを簡潔にCで記述
Slide 36
Slide 36 text
FFIは楽しい!