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
PHP-FPMのState、全部言えますか?〜ソースから辿るライフサイクル〜
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
193m
September 30, 2026
Programming
33
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHP-FPMのState、全部言えますか?〜ソースから辿るライフサイクル〜
2026/09/30 第191回 PHP勉強会@東京 での発表資料です。
193m
September 30, 2026
Other Decks in Programming
See All in Programming
Verilogで学ぶCPU自作入門
uyuki234
8
4.1k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
880
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.5k
RAG の “R” を Swift で覗いてみる 〜「意味から探す」検索の仕組み〜
nao_randd
0
160
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
設計次第でAIコードの読む量は減らせる / designing-for-code-reading
minodriven
35
17k
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
500
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
6.6k
sbt 2.0: takeoff
eed3si9n
0
160
Optunaを作ったときにやりたかったこと、その後 (2026/10/16, Optuna Meetup #3)
iwiwi
1
430
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
180
Featured
See All Featured
The SEO Collaboration Effect
kristinabergwall1
1
590
Embracing the Ebb and Flow
colly
88
5.2k
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2k
How to Talk to Developers About Accessibility
jct
2
580
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
380
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
The untapped power of vector embeddings
frankvandijk
2
1.9k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Building Adaptive Systems
keathley
44
3.2k
Building the Perfect Custom Keyboard
takai
2
910
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.2k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
220
Transcript
PHP-FPMのState、全部⾔えますか? 〜ソースから辿るライフライクル〜 2026/09/30 第191回 PHP勉強会@東京 193m X: @193m510 1 #phpstudy
⾃⼰紹介 • • • • • 193m (いちきゅうさんえむ) 職業エンジニア歴 4年
(2023〜) PHPer歴 3年 (2024〜) 翻訳して映画を観てお菓⼦を焼く系エンジニア 初登壇 X: @193m510 2 #phpstudy
突然ですが皆さん X: @193m510 3 #phpstudy
PHP-FPMのState、全部⾔えますか? X: @193m510 4 #phpstudy
Idle, Running…? X: @193m510 5 #phpstudy
私は⾔えませんでした (※⾔えなくても困りません) X: @193m510 6 #phpstudy
⾔える(?)ようになった経緯と その中で学んだことを共有します X: @193m510 7 #phpstudy
⽬次 1. 2. 3. 4. 5. 6. 7. 前提知識:PHP-FPM、FastCGI、State なぜStateの話?
ソースを読む 各State詳細 はじめの疑問に戻る まとめ 参考⽂献 X: @193m510 8 #phpstudy
前提知識 X: @193m510 9 #phpstudy
PHP-FPMとは • PHP FastCGI Process Manager • Webサーバ(Apacheやnginx)とPHPスクリプトを仲介する Webサーバ (Apache,
nginx…) 要求/応答 PHP-FPM Worker rocess process rocess 実⾏ PHP スクリプト ⽣成・管理 FastCGI PHP-FPM Parent process X: @193m510 10 #phpstudy
FastCGI (FCGI)とは • • • • Fast Common Gateway Interface
Webサーバとアプリ間の通信プロトコル CGIの改良版 (アプリ常駐でリソース削減) ソケット経由でFCGIリクエスト・レスポンスをやり取り Webサーバ (Apache, nginx…) ソケット アプリケーション FastCGIコネクション X: @193m510 11 #phpstudy
Stateとは • PHP-FPM Status Pageの⼀項⽬ ◦ curl http://localhost:8080/status?full これ X:
@193m510 12 #phpstudy
なぜStateの話? X: @193m510 13 #phpstudy
ことの発端 • ある⽇のPHP-FPM • 15分くらいずっとFinishingなプロセスが存在 • Finishingって何? X: @193m510 14
#phpstudy
マニュアルを⾒る • FPM の情報ページ - Manual ◦ https://www.php.net/manual/ja/fpm.status.php • 「プロセスの状態
- Idle, Running, …」 X: @193m510 15 #phpstudy
マニュアルを⾒る • FPM の情報ページ - Manual ◦ https://www.php.net/manual/ja/fpm.status.php • 「プロセスの状態
- Idle, Running, …」 • 状態の細かい説明はない X: @193m510 16 #phpstudy
マニュアルを⾒る • FPM の情報ページ - Manual ◦ https://www.php.net/manual/ja/fpm.status.php • 「プロセスの状態
- Idle, Running, …」 • 状態の細かい説明はない • ⼀覧すらない X: @193m510 17 #phpstudy
マニュアルを⾒る • FPM の情報ページ - Manual ◦ https://www.php.net/manual/ja/fpm.status.php • 「プロセスの状態
- Idle, Running, …」 • 状態の細かい説明はない • ⼀覧すらない だったら(ソースを)読めばいいだろ! X: @193m510 18 #phpstudy
ソースを読む X: @193m510 19 #phpstudy
ソースを読む • 愚直に “Finishing” 等でgrep • fpm_request.c • ソース上は「request_stage」 X:
@193m510 20 #phpstudy
fpm_request.c statusページのネタ元 • • • • 共有メモリのスコアボードに処理状況を書き込むコード State遷移はここでわかる 概ね各関数が各Stateに対応 処理フロー本体はfpm_main.c
X: @193m510 21 #phpstudy
Stateは7種類ある • 定義順≒遷移順 ◦ Creating ◦ Idle ◦ Reading headers
◦ Getting request information ◦ Running ◦ Ending ◦ Finishing X: @193m510 22 #phpstudy
各State詳細 X: @193m510 23 #phpstudy
0. Creating • 2025/5/26追加のルーキー ◦ PR #18662 (バグ修正) • 値0
= fpm_scoreboard_proc_free()でリセットされる初期値 ◦ max_requestsを終えたworkerのリセット処理 • 元は対応するステータス名がなかった ◦ 当時のステータス定義は1(Idle)始まりだった ◦ 特定のケースで名前が参照されるとSegmentation faultに X: @193m510 24 #phpstudy
1. Idle • FCGIコネクションのaccept〜FCGIヘッダを読む直前 ◦ 内部名 FPM_REQUEST_ACCEPTING のほうが明快かも • FCGIのon_accept()フックで設定
◦ workerループ処理の冒頭 (while条件) ◦ 前のリクエストの処理が終わり、次を待ち受ける時点 • FCGIコネクションのKeep-aliveにより挙動が変わる ◦ On: 初回のみaccept (以降は同コネクションを流⽤) ◦ Off: リクエスト処理が終わるごとにaccept (=都度Idle) X: @193m510 25 #phpstudy
2. Reading headers • FCGIヘッダを読む直前〜FCGIリクエストの読み終わり ◦ FCGIリクエストのon_readフックで遷移 • “headers”はFCGIヘッダの他、HTTPリクエストヘッダも含む FastCGIヘッダはこんなの
X: @193m510 26 #phpstudy
3. Getting request information • FCGIリクエスト読了〜スクリプト実⾏直前 ◦ 「ステージというより、SAPIに全リクエストパラメータが知 られた時点」(ソースコメント) •
PHPの初期化処理 (php_request_startup) はこの間に実⾏ ◦ スーパーグローバル変数($_COOKIE等)の初期化 ◦ 拡張機能のRINIT()処理 ◦ etc… X: @193m510 27 #phpstudy
4. Running • スクリプト実⾏開始〜完了 ◦ EOFやexitに⾄るまで ◦ ユーザ定義の処理の⼤半 (※例外は後述) •
基本的にIdleとここが⼀番⻑い X: @193m510 28 #phpstudy
5. Ending • 2011年追加 ◦ commit 8dcfa2f9169 • このStateになるタイミングはない •
タイムアウト判定処理の境界値としてのみ利⽤ ◦ fpm_request_check_timed_out() • 意味の明確化や予約のため? X: @193m510 29 #phpstudy
6. Finishing • スクリプトの実⾏完了後〜FCGI接続の次回acceptまで ◦ スクリプト実⾏完了後 ▪ fpm_request_end() ◦ FCGIリクエストのon_closeフック内
(主に異常系向け) ▪ fpm_request_finished() ユーザ定義の処理も混ざっていることに注意 • PHPの終了処理はここで実⾏ ◦ php_request_shutdown() ◦ シャットダウン関数、デストラクタ、出⼒バッファflush等 X: @193m510 30 #phpstudy
おさらい ⻩:active相当 灰:idle/その他相当 (accept) X: @193m510 31 #phpstudy
はじめの疑問に戻る X: @193m510 32 #phpstudy
ことの発端 (再掲) • ある⽇のPHP-FPM • 15分くらいずっとFinishingなプロセスが存在 • Finishingって何? X: @193m510
33 #phpstudy
Finishing (recap) • PHPスクリプトの処理⾃体は終わっている • 主にPHPの終了処理(php_request_shutdown())が実⾏ a. 残ったobserverなどを始末 b. 各種シャットダウン関数を実⾏
c. デストラクタを実⾏ d. 出⼒バッファのflush e. 実⾏時間リセット f. 拡張機能のRSHUTDOWN関数を実⾏ g. etc… X: @193m510 34 #phpstudy
Finishing (recap) • PHPスクリプトの処理⾃体は終わっている • 主にPHPの終了処理(php_request_shutdown())が実⾏ a. 残ったobserverなどを始末 b. 各種シャットダウン関数を実⾏
c. デストラクタを実⾏ d. 出⼒バッファのflush e. 実⾏時間リセット f. 拡張機能のRSHUTDOWN関数を実⾏ g. etc… X: @193m510 35 #phpstudy
⻑いFinishingの原因 • WebサーバがLBへのレスポンスに失敗し何度もリトライ • その間、ソケットが読み出されず詰まっていた • PHP-FPMも出⼒バッファflushを終えられず、Finishingが持続 > ss -ap
Netid State u_str ESTAB Recv-Q Send-Q Local Address:Port Peer Address:Port Processs 8 233472 /run/php-fpm/www.sock XXXX * XXXX users:(("php-fpm",pid=X,fd=5)) ※内容はイメージ 滞留 LB X: @193m510 滞留 www. sock Webサーバ 36 Worker #phpstudy
⻑いFinishingの対策 • LB <-> Webサーバ の挙動をどうにかするのは限界がある • たまに発⽣する程度なら実害はあまりない • ⼀応、タイムアウトで切ることは可能
◦ request_terminate_timeout_track_finished: On ▪ php-fpmの設定ディレクティブ ◦ 通常のTimeoutはFinishingを実⾏中と数えない ◦ Onにすると⻑時間のFinishingも切るようになる X: @193m510 37 #phpstudy
まとめ X: @193m510 38 #phpstudy
まとめ • PHP-FPMのStateは7種類(よく⾒るのは5種類) • Idle、Running以外も知っておくと (稀に) 役⽴つかも • LLMの⼒を借りれば、PHP(-FPM)ソースは案外読める ◦
膨⼤なので、取っかかり探しと全体感をLLM→そこから⾃分 でコードリーディング にて進⾏ ◦ 詰まったときの⼿がかりにもなる • ふだん意識しない基盤技術のソースを読むのは楽しい X: @193m510 39 #phpstudy
Thank you! X: @193m510 40 #phpstudy
参考⽂献 X: @193m510 41 #phpstudy
参考⽂献 + Further Reading • PHPソースコード • FastCGI Specification ◦
FastCGIとは?の部分 • PHP と SAPI と ZendEngine3 と ◦ そもそもPHP-FPMとは?SAPIとは?の解説 • php-fpm のパフォーマンスチューニングしたかったので旅に出た ◦ 本発表と⼀部重なる範囲のソースリーディング • php-fpm リクエストサイクル ◦ Stateには触れていないものの、本発表より詳細で明快 • php-fpm がリクエスト処理する仕組みを追う ◦ 上記と同じ⽅の登壇資料 X: @193m510 42 #phpstudy
参考⽂献 + Further Reading • Deep Dive PHP: FrankenPHP 詳細解説
◦ nginx+PHP-FPMとFrankenPHPの実⾏モデルの⽐較 • [PHPerKaigi2025]PHP実⾏環境の歴史 PHP-FPMからFrankenPHPの誕⽣へ ◦ 実⾏モデルの変遷がわかりやすくまとまったスライド • どこまで違う?!PHP実⾏環境パフォーマンス対決 - mod_php vs php-fpm vs Swoole vs FrankenPHP ◦ 実⾏モデルごとのパフォーマンス⽐較 • ことみんの登壇資料の作り⽅〜登壇はいいぞ〜 ◦ 資料作成の参考にさせていただきました X: @193m510 43 #phpstudy
EOF X: @193m510 44 #phpstudy