Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP-FPMのState、全部言えますか?〜ソースから辿るライフサイクル〜

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →
Avatar for 193m 193m
September 30, 2026

 PHP-FPMのState、全部言えますか?〜ソースから辿るライフサイクル〜

2026/09/30 第191回 PHP勉強会@東京 での発表資料です。

Avatar for 193m

193m

September 30, 2026

Other Decks in Programming

Transcript

  1. ⾃⼰紹介 • • • • • 193m (いちきゅうさんえむ) 職業エンジニア歴 4年

    (2023〜) PHPer歴 3年 (2024〜) 翻訳して映画を観てお菓⼦を焼く系エンジニア 初登壇 X: @193m510 2 #phpstudy
  2. ⽬次 1. 2. 3. 4. 5. 6. 7. 前提知識:PHP-FPM、FastCGI、State なぜStateの話?

    ソースを読む 各State詳細 はじめの疑問に戻る まとめ 参考⽂献 X: @193m510 8 #phpstudy
  3. 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
  4. FastCGI (FCGI)とは • • • • Fast Common Gateway Interface

    Webサーバとアプリ間の通信プロトコル CGIの改良版 (アプリ常駐でリソース削減) ソケット経由でFCGIリクエスト・レスポンスをやり取り Webサーバ (Apache, nginx…) ソケット アプリケーション FastCGIコネクション X: @193m510 11 #phpstudy
  5. マニュアルを⾒る • FPM の情報ページ - Manual ◦ https://www.php.net/manual/ja/fpm.status.php • 「プロセスの状態

    - Idle, Running, …」 • 状態の細かい説明はない • ⼀覧すらない X: @193m510 17 #phpstudy
  6. マニュアルを⾒る • FPM の情報ページ - Manual ◦ https://www.php.net/manual/ja/fpm.status.php • 「プロセスの状態

    - Idle, Running, …」 • 状態の細かい説明はない • ⼀覧すらない だったら(ソースを)読めばいいだろ! X: @193m510 18 #phpstudy
  7. Stateは7種類ある • 定義順≒遷移順 ◦ Creating ◦ Idle ◦ Reading headers

    ◦ Getting request information ◦ Running ◦ Ending ◦ Finishing X: @193m510 22 #phpstudy
  8. 0. Creating • 2025/5/26追加のルーキー ◦ PR #18662 (バグ修正) • 値0

    = fpm_scoreboard_proc_free()でリセットされる初期値 ◦ max_requestsを終えたworkerのリセット処理 • 元は対応するステータス名がなかった ◦ 当時のステータス定義は1(Idle)始まりだった ◦ 特定のケースで名前が参照されるとSegmentation faultに X: @193m510 24 #phpstudy
  9. 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
  10. 3. Getting request information • FCGIリクエスト読了〜スクリプト実⾏直前 ◦ 「ステージというより、SAPIに全リクエストパラメータが知 られた時点」(ソースコメント) •

    PHPの初期化処理 (php_request_startup) はこの間に実⾏ ◦ スーパーグローバル変数($_COOKIE等)の初期化 ◦ 拡張機能のRINIT()処理 ◦ etc… X: @193m510 27 #phpstudy
  11. 5. Ending • 2011年追加 ◦ commit 8dcfa2f9169 • このStateになるタイミングはない •

    タイムアウト判定処理の境界値としてのみ利⽤ ◦ fpm_request_check_timed_out() • 意味の明確化や予約のため? X: @193m510 29 #phpstudy
  12. 6. Finishing • スクリプトの実⾏完了後〜FCGI接続の次回acceptまで ◦ スクリプト実⾏完了後 ▪ fpm_request_end() ◦ FCGIリクエストのon_closeフック内

    (主に異常系向け) ▪ fpm_request_finished() ユーザ定義の処理も混ざっていることに注意 • PHPの終了処理はここで実⾏ ◦ php_request_shutdown() ◦ シャットダウン関数、デストラクタ、出⼒バッファflush等 X: @193m510 30 #phpstudy
  13. Finishing (recap) • PHPスクリプトの処理⾃体は終わっている • 主にPHPの終了処理(php_request_shutdown())が実⾏ a. 残ったobserverなどを始末 b. 各種シャットダウン関数を実⾏

    c. デストラクタを実⾏ d. 出⼒バッファのflush e. 実⾏時間リセット f. 拡張機能のRSHUTDOWN関数を実⾏ g. etc… X: @193m510 34 #phpstudy
  14. Finishing (recap) • PHPスクリプトの処理⾃体は終わっている • 主にPHPの終了処理(php_request_shutdown())が実⾏ a. 残ったobserverなどを始末 b. 各種シャットダウン関数を実⾏

    c. デストラクタを実⾏ d. 出⼒バッファのflush e. 実⾏時間リセット f. 拡張機能のRSHUTDOWN関数を実⾏ g. etc… X: @193m510 35 #phpstudy
  15. ⻑い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
  16. ⻑いFinishingの対策 • LB <-> Webサーバ の挙動をどうにかするのは限界がある • たまに発⽣する程度なら実害はあまりない • ⼀応、タイムアウトで切ることは可能

    ◦ request_terminate_timeout_track_finished: On ▪ php-fpmの設定ディレクティブ ◦ 通常のTimeoutはFinishingを実⾏中と数えない ◦ Onにすると⻑時間のFinishingも切るようになる X: @193m510 37 #phpstudy
  17. まとめ • PHP-FPMのStateは7種類(よく⾒るのは5種類) • Idle、Running以外も知っておくと (稀に) 役⽴つかも • LLMの⼒を借りれば、PHP(-FPM)ソースは案外読める ◦

    膨⼤なので、取っかかり探しと全体感をLLM→そこから⾃分 でコードリーディング にて進⾏ ◦ 詰まったときの⼿がかりにもなる • ふだん意識しない基盤技術のソースを読むのは楽しい X: @193m510 39 #phpstudy
  18. 参考⽂献 + Further Reading • PHPソースコード • FastCGI Specification ◦

    FastCGIとは?の部分 • PHP と SAPI と ZendEngine3 と ◦ そもそもPHP-FPMとは?SAPIとは?の解説 • php-fpm のパフォーマンスチューニングしたかったので旅に出た ◦ 本発表と⼀部重なる範囲のソースリーディング • php-fpm リクエストサイクル ◦ Stateには触れていないものの、本発表より詳細で明快 • php-fpm がリクエスト処理する仕組みを追う ◦ 上記と同じ⽅の登壇資料 X: @193m510 42 #phpstudy
  19. 参考⽂献 + 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