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は楽しい!