Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
入門Hello world(PHPカンファレンス2022)
Search
yutaron
September 24, 2022
Programming
970
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
入門Hello world(PHPカンファレンス2022)
PHPカンファレンス2022発表用
yutaron
September 24, 2022
Other Decks in Programming
See All in Programming
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
700
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
330
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
640
テーブルをDELETEした
yuzneri
0
150
SlackアプリとLambdaの 連携を構築した話
pawn_4_s
1
130
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.8k
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
250
AIが無かった頃の素敵な出会いの話
codmoninc
1
470
型も通る、synthも通る、それでも危ない 〜AIのCDKの権限とコストを機械で検証する〜 / It Passes Type Checks, It Passes Synth Checks, but It’s Still Risky — Automatically Verifying Permissions and Costs in AI’s CDK —
seike460
PRO
1
570
Claude Code全社展開のためにやったことn選~プラグイン302個・コミッター271人を支えるために~
kenchan
5
1.6k
仕様書を書く前にハーネスを作る - Agent Native開発は「探索を速く、判定を固く」
gotalab555
4
1.7k
Flow は今どうなっているか
mizdra
PRO
0
630
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.6k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
280
Are puppies a ranking factor?
jonoalderson
1
3.8k
Building an army of robots
kneath
306
46k
The SEO Collaboration Effect
kristinabergwall1
1
520
Statistics for Hackers
jakevdp
799
230k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
Technical Leadership for Architectural Decision Making
baasie
3
500
For a Future-Friendly Web
brad_frost
183
10k
Designing for humans not robots
tammielis
254
26k
Transcript
入門 Hello world
自己紹介 • 西 祐太郎 (長崎県産🐟) • 何でも屋さん@某クラウドソーシング会社 ◦ 専門学校 ->
中堅SI-> Webマーケ系スタートアップ -> オンライン旅行代理店 • 趣味:距離ガバドライブ🚗 • PHPカンファレンスは2020から参加 • GitHub: https://github.com/yuta-ron • Wantedly: https://www.wantedly.com/id/yutaron
• 1-2ヶ月に1回WordPress Meetup (大田区近辺) で遊んでいます ◦ エンジニアはあまりいません。 ◦ 主に会社のWeb担当とかマーケターとか個人事業主 ◦
趣味でホームページやっている人とか • 興味のある方はこちらから https://www.meetup.com/ja-JP/tokyo-wordpress-meetup/ 自己紹介(告知)
今日話すこと • 純粋なPHPのお話です。 • ブラウザがリクエストを投げて、帰ってくるまでのお話です。 話さないこと • Laravel/CakePHPなどのフレームワークの話
前提条件 • nginx1.23.1 (Source) + PHP 8.1.10 (Docker)
期待する動作
準備するもの • 適切なマシン (今回はMacBookAir M1 (Monterey)を使用。なんでもOKです) • ソースコード ◦ php/php-src
(コード追いかける用) ◦ nginx/nginx (デバッグビルドして適当にログ入れるとイメージ湧きます) • WireShark (パケットさえ見れればなんでもOKです)
PHPがどう動くか ❯ php -a Interactive shell php > echo 'Hello
world'; Hello world php >
PHPが実行されるまで • PHPはコードがそのまま実行されるわけではありません。 ◦ インタプリタ言語(リクエストの度に処理実行) • コンパイルする(バイトコード生成) ◦ 字句解析 ->(トークン化)->
構文解析 ▪ 抽象構文木 (AST) • 毎回コンパイルするんじゃ効率悪いよ🥺 ◦ これをキャッシュ(OPCache PHP5.5~) ▪ バイトコードをZend VM上で実行
PHPが実行されるまで • PHPはコードがそのまま実行されるわけではありません。 ◦ インタプリタ言語(リクエストの度に処理実行) • コンパイルする(バイトコード生成) ◦ 字句解析 ->(トークン化)->
構文解析 ▪ 抽象構文木 (AST) • 毎回コンパイルするんじゃ効率悪いよ🥺 ◦ これをキャッシュ(OPCache PHP5.5~) ▪ バイトコードをZend VM上で実行
ここまでの心境 • 気になりまくり ◦ バイトコードって何やねん(もやもや☁)
ここまでの心境 • バイトコードって何やねん(もやもや☁) ◦ お、簡単に見れるらしいぞ。 https://www.php.net/manual/ja/opcache.configuration.php
PHPが実行されるまで • PHPはコードがそのまま実行されるわけではありません。 ◦ インタプリタ言語(リクエストの度に処理実行) • コンパイルする(バイトコード生成) ◦ 字句解析 ->(トークン化)->
構文解析 ▪ 抽象構文木 (AST) • 毎回コンパイルするんじゃ効率悪いよ🥺 ◦ これをキャッシュ(OPCache PHP5.5~) ▪ バイトコードをZend VM上で実行
PHPがどう分解されていくか(字句解析編) • 今回はこのような簡単なコードで検証
PHPがどう分解されていくか(字句解析編) • PHPの標準関数で簡単に見える https://www.php.net/manual/ja/function.token-get-all.php
• 1列目 → トークン値 • 2列目 → トークン • 3列目
→ 行番号 PHPがどう分解されていくか(字句解析編) • さっきのソースを分解するとこんな感じ
PHPがどう分解されていくか(構文解析編) • さっきのトークンから、このような ASTを作って構文の妥当性を検証。 ◦ 四則演算、関数、クラス諸々が入るともはや解読不能 https://github.com/ircmaxell/php-ast-visualizer
PHPがどう分解されていくか (バイトコード編) • 今までのステップを経てバイトコードが生成される。 ◦ Zend VMはこれを実行する。 ←実際の命令 php.iniでopcacheの有効化が必要 FYI:
ダンプには https://github.com/derickr/vld を使うのもおすすめ
php-srcを 読んでみる static void zend_compile_echo(zend_ast *ast)
トークン値 シンボル名(token_name関数で取得) トークン値がソース内部でどう解釈されるか • さっきのソースを分解するとこんな感じ 267 -> T_INLINE_HTML 389 ->
T_OPEN_TAG 392 -> T_WHITESPACE 291 -> T_ECHO 291 -> T_WHITESPACE 291 -> T_CONSTANT_ENCAPSED_STRING
トークン値がソース内部でどう解釈されるか • さっきのソースを分解するとこんな感じ 267 -> T_INLINE_HTML 389 -> T_OPEN_TAG 392
-> T_WHITESPACE 291 -> T_ECHO 291 -> T_WHITESPACE 291 -> T_CONSTANT_ENCAPSED_STRING トークン値 シンボル名(token_name関数で取得)
php-srcを読んでみる T_ECHOでgrepかけてみる
php-srcを読んでみる T_ECHOでgrepかけてみる echoという文字を見つけたら T_ECHOでトークン化
php-srcを読んでみる T_ECHOでgrepかけてみる ASTを生成
php-srcを読んでみる T_ECHOでgrepかけてみる バイトコードを生成
php-srcを読んでみる • 今までのステップを経てバイトコードが生成される。 ◦ バイトコードから先の世界は省略します。 ←実際の命令
nginx編 location ~ \.php$ { fastcgi_pass 127.0.0.1:9000; }
流れ ブラウザからのリクエストをnginxが橋渡しする
流れ ブラウザからのリクエストをnginxが橋渡ししてfpmサーバへ
流れ nginx -> php-fpmの流れ curl http://localhost:10081(/) nginx nginx.conf (default.conf) 設定ファイルで
PHPファイルのパスを解決 fpmサーバの接続先を設定 (unixソケット指定の場合もあり) localhost:9000 (fpmサーバ)へ 対象のPHPのファイル実行に 必要な情報を伝達
流れ nginx -> php-fpmに飛んでいるリクエスト(補足)
流れ • DOCUMENT_ROOT (nginx.confのroot) はphpのコードが動作する環 境に合わせる。 • webサーバとappサーバが独立している場合は要注意。 (コンテナ環境(docker compose/ECS)
など) リクエスト nginx.conf
今までの流れをざっくり
まとめ • サンプルコードを用いたPHPのコード実行の流れ ◦ PHPのトークン化 -> AST -> バイトコード生成までの流れ •
ブラウザからPHPのコードを実行するまでの流れ ◦ webサーバとfpmサーバ間でやりとりする ◦ 上記がどのように繋がって疎通しているか ▪ 該当ソースコードの図示
参考 • PHP の echo と print の違い (闇) https://y-uti.hatenablog.jp/entry/2015/12/07/000027
• ミドルウェアのソースコードリーディングのすすめ https://developers.freee.co.jp/entry/how-to-read-source-code-of-middleware • Zend Engine 2 オペコード http://php.adamharvey.name/manual/ja/internals2.opcodes.php • PHP7 と HHVM/Hack 言語って何が違うの? https://www.infiniteloop.co.jp/tech-blog/2018/07/difference-between-php7-and-hhvm-hack/ • VLDでPHPのオペコードを確認する https://saitodev.co/article/VLD%E3%81%A7PHP%E3%81%AE%E3%82%AA%E3%83%9A%E3%82%B3%E3%83%B C%E3%83%89%E3%82%92%E7%A2%BA%E8%AA%8D%E3%81%99%E3%82%8B • 詳説ぺちぺち https://www.slideshare.net/do_aki/ss-11304937 • PHP AST 徹底解説 https://www.slideshare.net/do_aki/php-ast • JIT のコードを読んでみた https://www.slideshare.net/y-uti/jit-70023246 • 第9章 速習yacc https://i.loveruby.net/ja/rhg/book/yacc.html ありがとうございました!
おわり