PHP7.4のFFIについて / About PHP-FFI

PHP7.4のFFIについて / About PHP-FFI

PHP-FFI Foreign Function Interfaceについてまとめました。

F04982ad61107b5408ad139966596316?s=128

Ryo Tomidokoro

November 27, 2019
Tweet

Transcript

  1. PHP7.4のFFIについて Ryo Tomidokoro PHP勉強会 2019/11/27 @hanhan1978

  2. FFIとは

  3. Foreign Function Interface ↓ あるプログラミング言語から 他のプログラミング言語をコールする仕組

  4. PHP以外の言語にもある

  5. Perl FFI Ruby FFI Java JNI (Java Native Interface)

  6. FFIという単語自体は 特定プログラミング言語の呼び出しを意図しない ↓ PHP FFIは何ができる?

  7. [引用] PHP FFI Introduction - Manual https://www.php.net/manual/en/intro.ffi.php

  8. PHP-FFIは、Cの共有ライブラリをloadして Cの関数、データ構造にアクセス出来る -> と書いてある FFIというよりPNIという方が誤解が無さそう...

  9. 現状では、PHPを自前でコンパイルする以外に使う方法無し -> --with-ffi オプションを指定 -> Linuxでは libffi-devが必要 インストール

  10. Hello World

  11. Macの場合は... libc.dylib で動く...多分

  12. これが一体何の役に立つのか?

  13. これまでのPHPでは... extensionを作る以外になかった ↓ FFIがあれば、PHPから直接コールできる!!

  14. 例えば OpenCV

  15. https://github.com/vdechenaux/PhpWebcam

  16. IoTでもPHP gpio拡張ではなく ネイティブのライブラリをそのまま利用 PHPで無理すんなという話もあるが...

  17. 例えば GTK

  18. http://gtk.php.net/

  19. それ以外の活用法

  20. 計算量の多いPHPのプログラム ↓ FFI経由の呼び出しにすることで高速化

  21. https://blog.hanhans.net/2019/10/15/php-ffi/

  22. いわゆるCPUバウンドな処理は効果大 DB接続などのIOが多い場合は効果が薄い ↓ PHP8ではPHP自体がJITコンパイル この最適化は無闇に依存関係を増やしているだけかも

  23. 私的な結論

  24. あくまでも実験的な機能 仕事で使おうと考えない方が良いと思う。 ↓ 趣味のIoTや、言語自体の中身を深堀するなどの 研究的な用途としては非常に面白い。

  25. まさに今、CPU負荷に困っていて ピンポイントに適用できそう!という野心的な方 ↓ 試すこと自体は気軽にできるので Let’s Try

  26. そんな挑戦者に贈る

  27. https://github.com/hanhan1978/php-ffi-samples C, Goを使ったサンプル集

  28. PHP-FFIは、ネイティブライブラリとのIFとして FFI\CData を使用 GoでCGOを使う場合でも IFはCに合わせた方が上手くいきやすい。 GoのSliceとかは、特殊な構造体に変換されるので難しい。 PHP-FFIのコツ

  29. FFIの呼び出し処理は、FFI\CDataも含めて、同一スコープ 内でやりきること 例えば、FFI\CDataを別Scopeで作成しても、参照先のポイ ンターがNullになってしまう。 PHP-FFIのコツ2

  30. 後半

  31. PHP-FFIのことは、ざっくり分かった。 ↓ もっと深く!PHP-FFIの中身を見たい!(はず)

  32. https://blog.hanhans.net/2019/10/30/gdb-ffi/

  33. Linuxでは libffi を使う 1. dlopenで共有ライブラリをオープン 2. dlsymで実行したい関数のポインタを取得 3. ffi_prep_cifでffi_cif構造体を作成 4.

    ffi_callで関数を実行 ざっとまとめると
  34. 字面だけでは分かりにくい

  35. PHP-FFIがやっていることを簡潔にCで記述

  36. FFIは楽しい!