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
PHPのプロセス制御について
Search
Haruki Tazoe
July 26, 2025
0
37
PHPのプロセス制御について
https://hiroshimaphp.connpass.com/event/344543/
Haruki Tazoe
July 26, 2025
Tweet
Share
More Decks by Haruki Tazoe
See All by Haruki Tazoe
ちょっとした「翻訳ブーム」はこうして始まった
jdkfx
0
240
フロントエンドのチューニングに挑戦してみる
jdkfx
0
160
ドキュメント翻訳で学ぶ新しい言語仕様・機能
jdkfx
1
260
フレームワークの内部構造を理解するためにフレームワークを作ってみることにした / phpcon-2021
jdkfx
2
1.2k
Featured
See All Featured
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Done Done
chrislema
185
16k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
53
2.9k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
Measuring & Analyzing Core Web Vitals
bluesmoon
8
550
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Statistics for Hackers
jakevdp
799
220k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Optimizing for Happiness
mojombo
379
70k
Code Reviewing Like a Champion
maltzj
524
40k
Transcript
PHPのプロセス制御について 2025/07/26 PHP勉強会in広島 vol.4 田添春樹
それはある日突然に
受注の取得処理が止まる - 受注管理システムへ自動で受注を取り込む処理が止まっているとの情報が... - 受注を取得する処理において、プロセスが長時間実行されていたため、 最大プロセス数まで追い越してしまったのではないかと考えられる
目的 - 実際に手元で同じような環境をシンプルな形で構築する - ハングの検知とプロセスキルを行う処理を書いて、プロセスの滞留について 理解する
実装してみる
バッチ処理管理システムの実装 - https://github.com/jdkfx/process-manager - 同時に最大$maxProcesses 個までプロセスを 並列実行する - 子プロセスの実行時間を監視し、 時間がかかりすぎたものにはアラートや
強制終了を行う
プロセス管理クラスにおけるプロパティ - $maxProcesses 同時に実行できるプロセス数の上限 - $children 現在実行中の子プロセスのPID一覧 - $startTimes 子プロセスの開始時刻(監視用)
- $timeoutSeconds タイムアウトの閾値
タスクの実行 1. 各$task を順番に処理 2. 現在のプロセス数が上限を超えている場合は待機 waitForChild(); や checkTimeouts(); 3.
pcntl_fork(); で子プロセスを生成 - 子プロセス:$task->execute(); を実行し、終了 - 親プロセス:子プロセスの PID を記録 4. すべての子プロセスが終了するまで監視 monitorProcesses();
None
プロセスの待機 - waitForChild(); - 非同期で子プロセスの終了を待つ - 終了したらリストから削除 - 終了したプロセスがなければsleep(1); で1秒待機
- checkTimeouts(); - それぞれの子プロセスの実行時間を確認 - タイムアウト時間を過ぎていたらSTDERR に警告を出力 - ただし、プロセスの終了やkillはここではしない
None
プロセスの監視 - monitorProcesses(); - 実行時間に応じてアラートを出す: 10秒超 → 黄色 20秒超 →
マゼンタ 30秒超 → 赤色 + 強制終了 posix_kill(); - pcntl_waitpid(); で終了した子プロセスを回収・削除
None
実行してみる - 13、14、15のプロセスが並列実行 - 13、14に関しては処理がすぐに終わり 設定したタイムアウト値を超えずアラートが 出ていない - 15が30秒以上かかり、設定した10秒という タイムアウト値を超え始めたところから
アラートが出る - 最終的に30秒の時点で強制的にプロセスを キルされる
プロセスをキルできない場合は? - 高負荷な処理中に最大プロセス数まで追いついてしまい、 子プロセスをforkできず、長時間の滞留後にハングしてしまう (ハングしているように見えてみる) - 子プロセスに以下を実装して対処できる可能性がある - 子プロセスにタイムアウト処理を埋め込み -
子プロセスがexit()されない場合は、exit()されているか 確認するようにログを残す - リトライやバックオフの実装
再度、処理を行う
リトライとバックオフ - リトライ - 失敗した処理をもう一度やり直す - 一時的な失敗(タイムアウト、接続エラー、リソースの過負荷) に対して、再試行する - バックオフ
- リトライをすぐには行わず、時間をおいてから行うこと - サーバーや処理対象が一時的に混み合っている/不安定な時に 少し時間を開けて再試行することで成功率を上げる - 短時間で何度もアクセスしてサーバーをさらに重くしないようにする (所謂DoSを防ぐ)
リトライとバックオフ - Pros - ネットワークや外部リソースなどによる失敗を回避できる (DB接続やAPIエラー) - 高負荷時に連続処理によるリソース圧迫を緩和できる - 異常終了した処理を再試行することで、処理の信頼性が上がる
- Cons - 処理時間が伸びてしまい、リソース消費が伸び続けてしまう - 単純に処理がわかりにくくなる
自己紹介 - 名前・所属 - 田添春樹 / @jdkfx - 株式会社GoQSystem -
よく使う技術 ( 使っていた技術 ) - PHP, JavaScript, Vue.js, Svelte … - PHPとは学生時代に出会う - 個人開発や自作フレームワークの制作 - 最近はAWSにハマってる
ご清聴ありがとう ございました!