Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
入門Hello world(PHPカンファレンス2022)
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
yutaron
September 24, 2022
Programming
1k
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が実装を担う時代の「技術設計」と「チームマネジメント」
kamina_zzz
2
230
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
3
290
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
160
[DroidKnights 2026] Workflow AX: From Auto-Documented Policies to E2E Testing
raeminkang
0
540
SODA - FACT BOOK(JP)
sodainc
1
40k
クラウドゲーミングのパフォーマンス最適化に挑む / Cloud Gaming Performance Tuning
vivion
0
330
クラウドエージェントは、 何がそんなに便利なのか / what makes cloud agents so useful
rkaga
5
800
エージェントを使い続けるためのメタワーク / Meta-work for keeping using the agent
rkaga
6
2.2k
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
260
선언형 햅틱 라이브러리 진동을 소개합니다
l2hyunwoo
1
300
Rails初心者がパスキーを実装してみて大変だったこと
ktombow
0
150
Zero-Tap Sign-In対応、結局何をすればいいの?
mitohato14
0
1.8k
Featured
See All Featured
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
121
120k
Building the Perfect Custom Keyboard
takai
2
950
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
3.3k
From π to Pie charts
rasagy
1
440
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
420
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
Bash Introduction
62gerente
615
220k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
Side Projects
sachag
456
43k
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
930
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
290
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 ありがとうございました!
おわり