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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
yutaron
September 24, 2022
Programming
940
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
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
490
TAKTでAI駆動開発の品質を設計する
j5ik2o
6
1.1k
Semantic Version 単位で戦略を柔軟に変えて、パッケージアップデートを自動化する
daitasu
0
200
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
210
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
270
CSC307 Lecture 17
javiergs
PRO
0
320
These Five Tricks Can Make Your Apps Greener, Cheaper, & Nicer
hollycummins
0
280
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
230
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
JavaDoc 再入門
nagise
0
320
Oxlintのカスタムルールの現況
syumai
6
1.1k
Oxcを導入して開発体験が向上した話
yug1224
4
300
Featured
See All Featured
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
0
310
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
For a Future-Friendly Web
brad_frost
183
10k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Tell your own story through comics
letsgokoyo
1
950
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
WCS-LA-2024
lcolladotor
0
620
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
250
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
340
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
400
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
160
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 ありがとうございました!
おわり