Slide 1

Slide 1 text

php-src で遊ぶよ Github:@mkazutaka Twitter:@makazutaka Name: Kazutaka Matsumoto

Slide 2

Slide 2 text

who am i? 名前: Kazutaka Matsumoto 所属: 株式会社メルカリ 職種: バックエンドエンジニア(PHP or Go) PHP 歴: 8 ヶ月(2018 新卒)

Slide 3

Slide 3 text

最近書いたよー Microservices にジョインするには知らない技術が多すぎたので 一通り触ってみた話 https://tech.mercari.com/entry/2018/12/02/160455

Slide 4

Slide 4 text

タイトル php-src で遊ぶよ

Slide 5

Slide 5 text

PHP 初心者のジレンマ PHP で開発するからにはphp-src のことを知りたい php-src を知らなくてもPHP はかける ex) Laravel を読むのにphp-src は必要ない

Slide 6

Slide 6 text

ジレンマの難しいところ php-src は自分の時間で読む必要がある

Slide 7

Slide 7 text

さらにphp-src を読むハードルの高さも相まる

Slide 8

Slide 8 text

さらに プログラミング言語読んでも ・お金も儲からないし ・仕事に直接役立つわけでもないし ・そもそも効果わからんし

Slide 9

Slide 9 text

php-src で遊ぼうというタイトルで 申し込みしました

Slide 10

Slide 10 text

反省

Slide 11

Slide 11 text

今回のスライド pros) 浅いところまでなので聞き手が理解できる cons) 知識が浅い

Slide 12

Slide 12 text

Goal this section php-src で遊ぶ 副産物: php-src について知れる

Slide 13

Slide 13 text

Question php-src の中身を見たことある人 どれくらいいますか?

Slide 14

Slide 14 text

Question 拡張ライブラリを書いたことある人 どれくらいいます?

Slide 15

Slide 15 text

はじまり

Slide 16

Slide 16 text

はじめになにをやるか

Slide 17

Slide 17 text

手元にソースコードを置く

Slide 18

Slide 18 text

手元にソースコードを置く $ git clone [email protected]:php/php-src.git $ cd php-src $ git checkout -b develop

Slide 19

Slide 19 text

ビルドする

Slide 20

Slide 20 text

Docke le $ vim Dockerfile // Dockerfile FROM ubuntu:18.10 RUN apt update RUN apt upgrade -y RUN apt install -y build-essential autoconf automake \ libtool bison re2c libxml2-dev libsqlite3-dev ENV DIST_DIR=/tmp/php-src RUN mkdir -p $DIST_DIR WORKDIR $DIST_DIR

Slide 21

Slide 21 text

docker build And php-src build php-src のビルド ## docker run -v $PWD:/tmp/php-src -it php-src ./buildconf でも可能 > ./buildconf > ./configure --enable-debug --enable-maintainer-zts \ --with-readline \ --disable-all > grep "cpu cores" /proc/cpuinfo #4 > make -j4 $ docker build . -t php-src $ docker run -v $PWD:/tmp/php-src -it php-src bash root@# ls CODING_STANDARDS Makefile.fragments README.NEW-OUTPUT-API README.W CONTRIBUTING.md Makefile.gcov README.PARAMETER_PARSING_API README.i ...

Slide 22

Slide 22 text

実行 root@# sapi/cli/php -m [PHP Modules] Core ... [Zend Modules] root@# sapi/cli/php -a Interactive mode enabled php > echo 'Hello World'; Hello World

Slide 23

Slide 23 text

PHP overview ref: https://entwickler.de/wp-content/uploads/2013/06/wpm_2013_06.pdf

Slide 24

Slide 24 text

PHP overview overview ref: https://www.slideshare.net/do_aki/php-sapi-zendengine3

Slide 25

Slide 25 text

SAPI The Server Application Programming Interface PHP にアクセスするためのインターフェース エンドポイントとしての役割を持つ CLI やCGI はSAPI を経由してPHPCore 等にアクセス

Slide 26

Slide 26 text

ZendEngine コンパイラやVM といった機能を提供 上記を実現するための機能を提供 ZendEngine はPHP Core やSAPI から独立して提供されているはず メモリ管理のために構造体などを提供 詳しくは@do_aki さんのPHP と SAPI と ZendEngine3 がおすすめ http://d.hatena.ne.jp/do_aki/20180313/1520937886

Slide 27

Slide 27 text

PHP Core ZendEngine と役割は似てる ネットワークの管理やコマンドラインからのarugment の読むこむ 関数としてはfopen_function 等がある

Slide 28

Slide 28 text

php-src の主なせディレクトリ構成 . ├── Zend // ZendEngine 本体のディレクトリ ├── ext // 拡張ライブラリや動的ライブラリが格納 ├── main // SAPI やextension の共通メソッドが置かれている ...

Slide 29

Slide 29 text

拡張モジュール作ってみる 拡張モジュールの雛形は、ext_skel コマンドで作成できる $ ./ext_skel.php --ext 'hello_world'; cd hello_world $ ls config.m4 config.w32 hello_world.c php_hello_world.h tests $ ./buildconf $ ./configure --enable-debug \ --enable-maintainer-zts \ --with-readline \ --enable-hello_world --disable-all $ make -j4 $ sapi/cli/php -m [PHP Modules] ... hello_world ...

Slide 30

Slide 30 text

書いてみる 関数の定義 // ext/hello_world/hello_world.c PHP_FUNCTION(say_hello_world) { ZEND_PARSE_PARAMETERS_NONE(); php_printf("Hello World"); }

Slide 31

Slide 31 text

引数の定義 // ext/hello_world/hello_world.c ZEND_BEGIN_ARG_INFO(arginfo_say_hello_world, 0) ZEND_END_ARG_INFO() module functions に追加 // ext/hello_world/hello_world.c static const zend_function_entry hello_world_functions[] = { PHP_FE(say_hello_world, arginfo_say_hello_world) PHP_FE_END };

Slide 32

Slide 32 text

実行してみる ## ビルドし直す $ ./configure --enable-debug \ --enable-maintainer-zts \ --with-readline \ --enable-hello_world --disable-all $ make -j4 $ grep "cpu cores" /proc/cpuinfo #4 $ sapi/cli/php -a php > say_hello_world(); Hello World

Slide 33

Slide 33 text

関数に引数を使う PHP_FUNCTION(say_with_world) { char *s; size_t s_len; zend_string *r; ZEND_PARSE_PARAMETERS_START(1, 1) Z_PARAM_STRING(s, s_len) ZEND_PARSE_PARAMETERS_END(); r = strpprintf(0, "%s world", s); RETURN_STR(r); } ZEND_BEGIN_ARG_INFO(arginfo_say_with_world, 0) ZEND_ARG_INFO(0, str) ZEND_END_ARG_INFO()

Slide 34

Slide 34 text

static const zend_function_entry hello_world_functions[] = { ... PHP_FE(say_with_world, arginfo_say_with_world) ... }; 実行 php > print_r(say_with_world('hoge')); hoge world

Slide 35

Slide 35 text

まとめ php-src で遊んでみました それに伴い、PHP Core とZend Engine に対して簡単に解説をした また実際に、拡張ライブラリを実装を紹介した

Slide 36

Slide 36 text

時間があれば

Slide 37

Slide 37 text

RFC(Request for Comments) 技術仕様の提案や決定が書かれているページがある https://wiki.php.net/rfc Github のPR のリンクが書かれている

Slide 38

Slide 38 text

RFC: array_key_ rst().... 読める気がする RFC: https://wiki.php.net/rfc/array_key_ rst_last PR: https://github.com/php/php-src/pull/3256

Slide 39

Slide 39 text

まとめ php-src で遊ぶ php-src の概要を知る必要がある ソースコードの読み方を知る必要がある

Slide 40

Slide 40 text

終わり

Slide 41

Slide 41 text

参考資料 https://wiki.php.net/rfc http://php.net/manual/ja/internals2.ze1.zendapi.php https://qiita.com/7968/items/2aa487e2e515dba2fd03 https://thinkit.co.jp/free/article/0705/7/1/