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
Miyamoto Naoyuki
June 05, 2026
Technology
370
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
あえてPHPでリアルタイム通信をやってみる
フロントエンド・PHPカンファレンス北海道2026 #frontend_phpcon_do #vaddy_room
Miyamoto Naoyuki
June 05, 2026
More Decks by Miyamoto Naoyuki
See All by Miyamoto Naoyuki
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
170
HTTPに新しいMethod! QUERY RFC10008
supurazako
0
30
MinecraftにP2Pが来るぞ!
supurazako
0
84
標準化っていいな〜JANOGでの学び〜
supurazako
0
89
Other Decks in Technology
See All in Technology
【5分でわかる】セーフィー エンジニア向け会社紹介
safie_recruit
0
53k
事業価値と Engineering 2026年度版
recruitengineers
PRO
10
2k
20260608_Codexの可能性_ノンプログラマー向け_大城追記
doradora09
PRO
0
750
QAタスクをスキル化したいときに考えること
aomoriringo
0
160
SnowflakeCoCoでデータエンジニアリング!
foursue
0
140
13年運用タイトルのサーバーサイドが辿り着いた現在地 ― モンスターストライクにおける技術・組織・AI活用から得た知見
mixi_engineers
PRO
1
430
AIがコードを書く時代、人間は何を保証するのか———馬場さんと考える、開発者に求められる新しい責任と価値 - TECH PLAY
netmarkjp
0
1.2k
【CEDEC2026】ゲームシナリオライターを支援するAIツール開発の実践 ― 設計とプロンプトの工夫 ―
cygames
PRO
1
690
AIがAPIを書く時代に、私たちは何を設計すべきか
nagix
0
200
セキュリティ研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
33
28k
Forza Horizon 6 のテレメトリ機能で 自動運転に使えそうな学習データを集める話
henjin0
0
110
【CEDEC2026】次世代デジタルカードゲームのサーバー設計と運用 〜『Shadowverse: Worlds Beyond』の舞台裏~
cygames
PRO
0
560
Featured
See All Featured
Music & Morning Musume
bryan
47
7.3k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
380
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Building Adaptive Systems
keathley
44
3.2k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
260
Navigating Team Friction
lara
192
16k
Fireside Chat
paigeccino
42
4k
Practical Orchestrator
shlominoach
191
12k
Transcript
あえてPHPでリアルタイム通信をやってみる 2026-06-06 フロントエンド・PHPカンファレンス北海道2026 宮本直幸@MSprzk
$ cat profile.service [Unit] Description=Self Introduction After=network.target [Profile] Name="Miyamoto Naoyuki"
Twitter="@Msprzk" Affiliation="北海道情報大学2年" Interest="Network",”Security”,”WebRTC”
None
北海道のおすすめのところ
伝えたいこと PHPは、リアルタイム通信ができないわけではない
きっかけ
←WebSocket, WebRTCが大好き ←PHPはTODOアプリを作ったことがあるくらい
PHPでもリアルタイム通信をできるのかな? 調べてみたらあんまり得意ではなさそう...
PHPでもリアルタイム通信をできるのかな? 調べてみたらあんまり得意ではなさそう... やってみなくちゃわからない
そもそもリアルタイム通信とは
遅延が少なく、ほぼリアルタイムで通信すること(厳密な定義は不明) 通話、ビデオ会議、オンラインゲームなどで使われることが多い リアルタイム通信技術の例: WebSocket, WebRTC, etc… リアルタイム通信とは
検証の環境 バージョンと環境 - MacBook Air M2 - Memory 8GB -
PHP: 8.5.6 - Go: 1.26.3 - Node.js: v26.0.0
検証方法 - PHP / TypeScript / Go でWebSocket relayを実装 -
動画を送信し、20のreceiverにrelayする - 送信は基本的にPlaywrightのheadless(GUI付きとあまり変わらない結果 だったので、全てheadlessで撮り直しました) - 各実装ごとに10回実行 - 実行順による偏りを避けるため、ランダムな順番で実行 - 各実行ごとにp95, p99, max latency, loss, append error を計測 - 比較値は主に10回の実行の median p95, p99 = 遅延分布の95%, 99%地点. 99%地点が悪いほど、まれに大きくつまっているということ
UI使ったバージョン
実験結果
単一プロセスの場合 実装 loss append error 受信側p99 遅延 サーバ側 p99遅延 評価
TS 0 0 15.05ms 3.00ms 成立 PHP 0 0 61.95ms 19.50ms 成立 Go 0 0 24.80ms 5.50ms 成立 ※ p99: 遅延分布の99%地点。数値は10回実行した中央値。 ※ 受信側 p99 遅延: 各receiverのp99を平均した値。
そんなことあるか? PHPの仕様について調べてみよう
PHPの強み →Web向けサーバーサイドスクリプト →短命のHTTP処理が得意 →通常のWeb Page, API処理では強み PHPの仕様
リアルタイム通信で必要な性質 →短命ではなく長命のconnection →slow receiverの影響を他receiverから隔離する →receiver ごとの queue を持つ PHPの仕様
リアルタイム通信で必要な性質 →短命ではなく長命のconnection →slow receiverの影響を他receiverから隔離する →receiver ごとの queue を持つ PHPの仕様 仮説:
PHP(FPM)の強みは、リアルタイム通信では 相性が良くないはず
単一プロセスで動くものは少ないよね... Node.jsのような, PHPの代表的な 実行環境について調べてみよう
PHP-FPM: PHPのWeb実行環境 PHP-FPM
PHP-FPM: PHPのWeb実行環境 PHP-FPM
PHP-FPM
検証内容: 長命WebSocket接続がreadyになるまでの待ち時間 Clients: 6 maxWorkers: 2 Hold: 10秒 ※maxWorkersは、workerの占有をわかりやすくするために意図的に低い上限にしています ※Hold
→ 接続を張ったあと、その接続を保持し続ける時間 PHP-FPM(風)
PHP-FPM(風) 実装 モデル ready p50 ready p99 評価 php-process-pool FPM的worker
pool 10112.00ms 20218.50ms 後続接続が待 たされる ts-native Node.js event loop 4.00ms 9.00ms ほぼ同時 go-native Go goroutine 4.00ms 14.00ms ほぼ同時
なぜ待たされるのか 長命接続が worker を占有する ↓ worker 数を超えた接続は ready になる前に待たされる
1. 接続を変える場所 - 長命接続をどの実行モデルで持つか - FPM風 worker poolでは、connectionがworkerを占有 2. 接続後に送る場所
- 接続済みreceiverにどう配信するか - 遅いreceiverの影響を他receiverに波及させないか リアルタイム通信で詰まる場所は2つある
FPM風 worker poolから外しても、リアルタイム通信の難しさは消 えるわけではない 接続済み receiverに動画を送る時、遅い(回線の悪い)receiverが いると、他receiverに波及する可能性がある →同じPHPの単一常駐プロセス内で、送信設計を変えて比較 単一常駐プロセス内の送信設計
FPM風 worker poolから外しても、リアルタイム通信の難しさは消 えるわけではない 接続済み receiverに動画を送る時、遅い(回線の悪い)receiverが いると、他receiverに波及する可能性がある →同じPHPの単一常駐プロセス内で、送信設計を変えて比較 単一常駐プロセス内の送信設計
php-ws php-ws-queued 順番に送る 書けるものから 書く
実装 送信設計 受信側p99 サーバー側p99 通常receiver p99 評価 php-ws 全receiverへ同 期write
95.90ms 13.00ms 86.49ms 波及しやすい php-ws-queued receiverごとの write buffer 46.67ms 3.00ms 27.12ms 波及が減る
- FPM風 worker poolの問題は、長命接続をどこで抱えるかという 実行モデルの問題 - Queued での問題は、接続後にどう送るかという送信設計の問題 つまり、PHPでリアルタイム通信をやるなら、 -
FPM的な request/response モデルから外す - 常駐サーバー内で receiver ごとの queue / backpressure を設計する という2段階の設計が必要になる ここから言えること
- PHPでのリアルタイム通信は不可能ではない - 単一の常駐プロセスとしては、普通に動く - ただし、PHP-FPMのようなWeb実行モデルは、長命接続を大量に抱える 設計になっていない - FPMから外しても、 queue,
backpressure の設計は必要 - PHPでリアルタイム通信をやるには、常駐サーバと送信制御を明示的に設計 する必要がある 結論
伝えたいこと PHPは、リアルタイム通信ができないわけではない
PHP Manual: FastCGI Process Manager (FPM) https://www.php.net/manual/en/install.fpm.php PHP Manual: FPM
Configuration https://www.php.net/manual/en/install.fpm.configuratio n.php 参考
https://github.com/supurazako/php-realtime
UDP版も作ってみましたが、 - protocolの違いは本質ではなかった - 送られる映像がガビガビ & 遅延が酷すぎる - 上記の問題を解決するための実装はあまりにも重すぎる ↑の理由から説明しませんでした
おまけ: UDP版も作ってみたが...