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
10
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
220
フロントエンドのチューニングに挑戦してみる
jdkfx
0
160
ドキュメント翻訳で学ぶ新しい言語仕様・機能
jdkfx
1
260
フレームワークの内部構造を理解するためにフレームワークを作ってみることにした / phpcon-2021
jdkfx
2
1.2k
Featured
See All Featured
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Visualization
eitanlees
146
16k
KATA
mclloyd
30
14k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.4k
VelocityConf: Rendering Performance Case Studies
addyosmani
332
24k
Writing Fast Ruby
sferik
628
62k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
The Power of CSS Pseudo Elements
geoffreycrofte
77
5.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
760
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Balancing Empowerment & Direction
lara
1
490
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にハマってる
ご清聴ありがとう ございました!