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
960
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
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
890
型も通る、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
470
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
290
광주소프트웨어마이스터고등학교 DevFest 특강 - 바이브 코딩 시대에서 주니어 개발자로 살아남는 방법
utilforever
1
160
PostgreSQL 18で考えるUUID主キー
kazuhiro1982
0
430
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
180
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
470
分散システム、なんですぐ死んでしまうん?耐障害性を高めたいあなたのためのレジリエンスパターン入門
mshibuya
7
7.1k
テーブルをDELETEした
yuzneri
0
120
Foundation Models frameworkで画像分析
ryodeveloper
1
160
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
190
えっ!!コードを読まずに開発を!?
hananouchi
0
280
Featured
See All Featured
The Mindset for Success: Future Career Progression
greggifford
PRO
0
430
Product Roadmaps are Hard
iamctodd
55
12k
Google's AI Overviews - The New Search
badams
0
1.1k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.7k
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
360
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
420
Why Our Code Smells
bkeepers
PRO
340
58k
Test your architecture with Archunit
thirion
1
2.3k
Faster Mobile Websites
deanohume
310
32k
Music & Morning Musume
bryan
47
7.3k
Visualization
eitanlees
152
17k
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 ありがとうございました!
おわり