Slide 1

Slide 1 text

PHPでGoを実行する xTech ゆるっとLT Fukuoka.php and AR_Fukuoka 2021.9.3 清家史郎 1

Slide 2

Slide 2 text

自己紹介 - ID - - - 清家 史郎 GitHub:seike460 Twitter:@seike460 Work at - 株式会社 Fusic (フュージック) 技術開発本部/技術開発第一部門 - チームリーダー/エバンジェリスト/プリンシパルエンジニア Skill - PHP/Go/AWS Personal - PHPカンファレンス福岡2020 幻の実行委員長 - Fukuoka.php Organizer 46fm パーソナリティ @seike460 2

Slide 3

Slide 3 text

Agenda 1. PHPってどんな言語? 2. Foreign Function Interface(FFI) 3. PHPでGoを実行する 4. まとめ 3

Slide 4

Slide 4 text

01 PHPってどんな言語?

Slide 5

Slide 5 text

PHPってどんな言語? - PHPと言えば? - - Webサイトで使われている バックグラウンドのバッチ処理などにも使えたり、いろいろな用途で使える とはいえ、Web用の言語何でしょう? その壁を壊すための仕組みがあります。 5

Slide 6

Slide 6 text

02 Foreign Function Interface

Slide 7

Slide 7 text

Foreign Function Interface(FFI) 7

Slide 8

Slide 8 text

Foreign Function Interface(FFI) - This extension allows the loading of shared libraries (.DLL or .so), calling of C functions and accessing of C data structures in pure PHP, without having to have deep knowledge of the Zend extension API, and without having to learn a third “intermediate” language. The public API is implemented as a single class FFI with several static methods (some of them may be called dynamically), and overloaded object methods, which perform the actual interaction with C data. - この拡張モジュールを使用すると、共有ライブラリ (.DLL または .so) の読み込み、C 言語の関数の呼び出し、C 言語 のデータ構造へのアクセスを純粋な PHP で行うことができ、Zend 拡張モジュールの API を深く理解する必要も、第 三の「中間」言語を学ぶ必要もありません。パブリック API は、いくつかの静的メソッド (そのうちのいくつかは動的に コールされることもあります) とオーバーロードされたオブジェクトメソッドを持つ単一の FFI クラスとして実装されてお り、C データとの実際のやり取りを行います。 8

Slide 9

Slide 9 text

Foreign Function Interface(FFI) asdfを利用してPHP-FFIをインストールする asdf … anyenvの様な様々なのバージョンの言語管理が出来るツール # PHPのconfigure_optionを設定 $ export PHP_CONFIGURE_OPTIONS="--with-ffi --with-iconv=/usr/local/opt/libiconv --with-openssl=/[email protected]@" # 7.4.22をインストール $ asdf install php 7.4.22 # 利用するPHPを7.4.22に切替 $ asdf glonal php 7.4.22 # モジュールがインストールされているかを確認 $ php -m | grep FFI FFI 9

Slide 10

Slide 10 text

Foreign Function Interface(FFI) 以下のコードを実行して、C言語のprintf() を呼び出すことが可能出来た printf("Hello %s!\n", "world"); $ docker run -it --rm -v "$PWD":/tmp -w /tmp php-ffi php BasicFFIusage.php Hello world! 10

Slide 11

Slide 11 text

03 PHPでGoを実行する

Slide 12

Slide 12 text

PHPで実行出来るのはC言語では? cgo GoからCの関数/型に アクセスするために 用いるパッケージ -> cgoを通して、 共有ライブラリ化 すれば実行出来るはず! 12

Slide 13

Slide 13 text

cgo 以下の様なGoのコードを記述 足し算と引き算をする簡単な関数 package main import "C" //export add ※add関数をexport func add(i int, n int) int { return i + n } //export minus ※minus関数をexport func minus(i int, n int) int { return i - n } func main() {} 13

Slide 14

Slide 14 text

cgo -buildmode=c-shared で作成、Macで利用するため dylib として共有ライブラリ $ go build -buildmode=c-shared -o seike460.dylib seike460.go PHP側から呼び出し add(3, 2) . PHP_EOL; echo $ffiGo->minus(3, 2) . PHP_EOL; $ php ffi.php 5 1 14

Slide 15

Slide 15 text

hanhan's blog 15

Slide 16

Slide 16 text

PHP7.4のFFIについて @hanhan1978 16

Slide 17

Slide 17 text

さらに 17

Slide 18

Slide 18 text

まとめ Point 1 PHPはFFIという仕組みを使うことで、さらなる広がりを見せます。 Point 2 cgoというライブラリを利用することで、Goで書いたコードをPHPに実行させることが可能 Point 3 PHPからカメラを使える可能性があるかも…! -> 使えてました Point 4 登壇ネタは必ず新規のものではなくてよいと思いますが、 事前に簡単に調べておくと良いと思いました。 18

Slide 19

Slide 19 text

Thank You ご清聴いただきありがとうございました We are Hiring ! https://recruit.fusic.co.jp/