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でWebSocketサーバーを実装しよう2025
Search
kubotak
June 28, 2025
Programming
0
440
PHPでWebSocketサーバーを実装しよう2025
PHPカンファレンス2025
kubotak
June 28, 2025
Tweet
Share
More Decks by kubotak
See All by kubotak
情報漏洩させないための設計
kubotak
7
2.3k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
160
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
560
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
940
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
11k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.3k
ウォーターフォールに思えたプロジェクトにあったアジャイルの要素
kubotak
2
810
Felteで作る簡単フォームバリデーション
kubotak
1
1.7k
SvelteKitを本番投入してみて
kubotak
2
2.1k
Other Decks in Programming
See All in Programming
The state patternの実践 個人開発で培ったpractice集
miyanokomiya
0
150
State of CSS 2025
benjaminkott
1
120
Kiroの仕様駆動開発から見えてきたAIコーディングとの正しい付き合い方
clshinji
1
140
AHC051解法紹介
eijirou
0
620
大規模FlutterプロジェクトのCI実行時間を約8割削減した話
teamlab
PRO
0
490
Oracle Database Technology Night 92 Database Connection control FAN-AC
oracle4engineer
PRO
1
120
Understanding Ruby Grammar Through Conflicts
yui_knk
1
120
Constant integer division faster than compiler-generated code
herumi
2
690
Nuances on Kubernetes - RubyConf Taiwan 2025
envek
0
190
The State of Fluid (2025)
s2b
0
190
「リーダーは意思決定する人」って本当?~ 学びを現場で活かす、リーダー4ヶ月目の試行錯誤 ~
marina1017
0
240
Infer入門
riru
4
1.6k
Featured
See All Featured
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.8k
Gamification - CAS2011
davidbonilla
81
5.4k
Faster Mobile Websites
deanohume
309
31k
Visualization
eitanlees
146
16k
Designing for Performance
lara
610
69k
Imperfection Machines: The Place of Print at Facebook
scottboms
268
13k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
How STYLIGHT went responsive
nonsquared
100
5.7k
Designing for humans not robots
tammielis
253
25k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.5k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
Transcript
Copyright© M&Aクラウド PHPで WebSocketサーバーを実装しよう 2025 PHPConference 2025 / Kenjiro Kubota
Copyright© M&Aクラウド Profile 久保⽥ 賢⼆朗 kubotak-is kubotak_public kenjiro.kubota 株式会社M&Aクラウド所属 TypeScript
PHP https://kubotak.page プロフェッショナルWebプログラミング Laravel (共著) 愛⽝:⾖柴 kubotak
Copyright© M&Aクラウド 今⽇話すこと、話さないこと ⭕ 話すこと ❌ 話さないこと • ⼀般的なPHPアプリケーションとWebSocketサーバーの⼤まかな違い •
PHPでWebSocketサーバーを実装できるライブラリ‧ミドルウェアの紹介 • それらのライブラリ‧ミドルウェアがどのようにノンブロッキング処理を扱ってい るのか • 各ライブラリ‧ミドルウェアの詳細 • WebSocketの実運⽤やセキュアに扱うこと
Copyright© M&Aクラウド そもそも、WebSocketってなに
Copyright© M&Aクラウド WebSocketとは RFC 6455(2011) The WebSocket Protocol 仕様 HTTPのリクエスト->レスポンス1往復という枠を超えて双⽅向‧常時接続をブラ
ウザで実現するもの ⽬的 チャット‧ゲーム‧IoTテレメトリ‧共同編集など ユースケース
Copyright© M&Aクラウド WebSocketは ⼀般的なHTTP通信と何が違うのか
Copyright© M&Aクラウド PHPで⼀般的?といえば(コンテナ時代ではもう古いかもしれないが) Nginx+php_fpm
Copyright© M&Aクラウド PHPで⼀般的?といえば(コンテナ時代ではもう古いかもしれないが) Nginx+php_fpm レスポンスを返したら処理は終了する
Copyright© M&Aクラウド WebSocket
Copyright© M&Aクラウド WebSocket 接続確⽴後は双⽅向通信に切り替わる ので処理は継続する
Copyright© M&Aクラウド WebSocketサーバーを作る上での課題
Copyright© M&Aクラウド ⼀般的なWebサーバーでWebSocketサーバーを作る場合(概念) クライアントの数だけサーバープロセ スが必要になり、現実的ではない クライアント サーバープロセス クライアント サーバープロセス クライアント
サーバープロセス
Copyright© M&Aクラウド WebSocketサーバーを実現するためにはノンブロッキングが重要 クライアント ノンブロッキング型 クライアント クライアント I/O待ちでワーカーを占有しない仕組みとして ノンブロッキング型が必要
Copyright© M&Aクラウド ノンブロッキングとは
Copyright© M&Aクラウド ブロッキング 処理1 HTTP API Call 処理2 Database 時間
前の処理が終わらないと次の処理を実⾏しな い、⼿続き型に実⾏されるプログラム
Copyright© M&Aクラウド ノンブロッキング 処理1 HTTP API Call 処理2 Database 時間
I/O待ちある処理の間に別の処理を実⾏する、 並⾏プログラム
Copyright© M&Aクラウド 前提知識はここまで ここからはWebSocketサーバーを実現できる 愉快な仲間を紹介するぜ!
Copyright© M&Aクラウド 今回のWebSocketサーバーのレギュレーション 次の仕様を満たすWebSocketサーバーが作れることを期待します。 1. チャットとしてメッセージが送信できる 2. その他のWebSocketに接続されているクライアントに、別のクライアントの メッセージがサーバーから送信される 作るもの:超簡易的チャット
Copyright© M&Aクラウド Ratchet
Copyright© M&Aクラウド Ratchet https://github.com/ratchetphp/Ratchet RatchetはPHP⽤のWebSocketライブラリで、リアルタイムのWebアプリケーショ ンを構築するために使⽤されます。 ReactPHPをベースにノンブロッキングI/Oを実現しています。 v0.1のタグが切られたのが2012年5⽉12⽇
Copyright© M&Aクラウド Ratchet
Copyright© M&Aクラウド Ratchet ReactPHP https://reactphp.org リアクターパターンを⽤いたイベント駆動により、ノンブロッキングI/OをPHPで 実現しているライブラリ。 ReactPHPはイベントループを利⽤しており、⼊出⼒ストリームやタイマー、シグ ナルなどを使って、リアクターパターンで実現されます。これは、Node.js や
Twisted(Python)、EventMachine(Ruby)に似た仕組みです。 https://reactphp.org/event-loop/
Copyright© M&Aクラウド イベントループの概念 Event Event Event Event Event Event Database
File System Network … … … 完了したものが戻る 完了を待たずに次々に実⾏ Response Request Event Queue Thread Pool/ Worker Thread Event Loop
Copyright© M&Aクラウド Ratchet コード例(server.php)
Copyright© M&Aクラウド Ratchet コード例(server.php) WsServerに渡す処理を時前で実装する
Copyright© M&Aクラウド Ratchet コード例(Chat Class)
Copyright© M&Aクラウド Ratchet コード例(Chat Class)
Copyright© M&Aクラウド Ratchet コード例(Chat Class)
Copyright© M&Aクラウド Ratchet WebSocketサーバーの動作確認
Copyright© M&Aクラウド AMPHP
Copyright© M&Aクラウド https://github.com/amphp/amp AMPHP(Asynchronous Multitasking PHP)はPHP8.1から実装されたFiberを ベースに⾮同期処理を実現しています。Fiberは軽量スレッド(コルーチン)の⼀ 種で、スレッドやプロセスとは異なり、軽量な並列処理を提供します。 また、AMPHPはRevolteというイベントループライブラリを利⽤し、並列処理やス ケジュールが⾏われています。
Copyright© M&Aクラウド AMPHP コルーチン コルーチン(coroutine)は、「⼀時停⽌」や 「再開」ができる関数の⼀種で、⾮同期処理や並 ⾏処理を簡潔に書くための仕組みです。 普通の関数とは異なり、実⾏を途中で中断し、後 から続きから再開することができます。
Copyright© M&Aクラウド AMPHP AMPHPについて詳しく知りたい⽅はやまゆさんのスライドおすすめです。 https://speakerdeck.com/myamagishi/da-jie-pou-amphpwoshi-tutefei-tong-qi-php-woshi-xian-siyou
Copyright© M&Aクラウド AMPHP コード例(server.php)
Copyright© M&Aクラウド AMPHP コード例(server.php)
Copyright© M&Aクラウド AMPHP コード例(server.php)
Copyright© M&Aクラウド AMPHP WebSocketサーバーの動作確認
Copyright© M&Aクラウド Workerman
Copyright© M&Aクラウド Workerman https://www.workerman.net Workermanは、PHPで書かれた⾼性能な⾮同期イベント駆動型ソケットフレームワークで す。純粋なPHPで実装されており、HTTP、WebSocket、SSL、その他のカスタムプロトコルを サポートしています。 WorkermanはNginxに似ており、以下の要素で構成されています。 1. マルチプロセス(複数のワーカープロセスで並⾏処理)
2. ノンブロッキングI/O 3. イベントループ 技術的にはReactPHPに似ていて、stream_select関数でI/Oを多重化している。
Copyright© M&Aクラウド Workerman コード例(server.php)
Copyright© M&Aクラウド Workerman コード例(server.php)
Copyright© M&Aクラウド Workerman コード例(server.php)
Copyright© M&Aクラウド Workerman コード例(server.php)
Copyright© M&Aクラウド Workerman コード例(server.php)
Copyright© M&Aクラウド Workerman 今回のコードのアーキテクチャ クライアント クライアント Gateway:8082 Gateway:8082 Gateway:8082 Gateway:8082
Business Worker Business Worker Register:1236 RegisterがGatewayやBusinessWorker を管理する
Copyright© M&Aクラウド Workerman WebSocketサーバーの動作確認
Copyright© M&Aクラウド RoadRunner
Copyright© M&Aクラウド https://roadrunner.dev RoadRunnerは、Go⾔語で書かれた⾼性能なPHPアプリケーションサーバーです。 特徴としては、 • ⾼性能 ◦ PHPワーカープロセスを常駐させることでbootstrap処理を削減 •
マルチプロトコル対応 ◦ HTTP、gRPC、TCPなどをサポート • プラグインアーキテクチャ ◦ 機能を拡張可能なプラグインシステム • メモリ効率 ◦ ワーカープロセスの再利⽤でメモリ使⽤量を最適化
Copyright© M&Aクラウド RoadRunner 結論から⾔うと、要件を満たすWebSocketサーバーは作れませんでし た。 v2系まではspiral/roadrunner-broadcastを利⽤することで、クライアント間のデータを相互に やり取りできたみたいなんですが、現⾏のバージョンではこのライブラリが使えません。 CentrifugeというGo製のWebSocketサーバーと連携するroadrunner-php/centrifugoを使う ことでWebSocketサーバーのビジネスロジックをPHPで記述することは可能みたいですが、 RoadRunner単体で動かすことはできませんでした。
(実はできるよという情報をお持ちの⽅は懇親会で教えて下さい)
Copyright© M&Aクラウド RoadRunner WebSocketサーバーの動作確認
Copyright© M&Aクラウド Swoole
Copyright© M&Aクラウド https://www.swoole.com Swooleは、C/C++で作られたPHPの拡張モジュールでイベント駆動型の⾮同期処理やコルーチ ンに基づく並列ネットワークエンジンです。 • ⾼性能: C/C++で実装されたコアエンジンによる⾼速処理 • ⾮同期処理:
イベント駆動型アーキテクチャによる効率的なI/O処理 • コルーチン: 軽量なコルーチンによる並⾏処理 • メモリ常駐: プロセスが常駐することによるオーバーヘッドの削減 • マルチプロトコル対応: HTTP、WebSocket、TCP、UDP等をサポート
Copyright© M&Aクラウド Swoole ちなみに、Swooleコミュニティで諸々あって枝分かれし、OpenSwooleというフォークがコ ミュニティ主体で開発されています。特に意味はないが今回はOpenSwooleを使いました。 (多分使い⽅は同じだと思われます)
Copyright© M&Aクラウド Swoole コード例(server.php)
Copyright© M&Aクラウド Swoole コード例(server.php)
Copyright© M&Aクラウド Swoole コード例(server.php)
Copyright© M&Aクラウド Swoole コード例(server.php)
Copyright© M&Aクラウド Swoole WebSocketサーバーの動作確認
Copyright© M&Aクラウド まとめ 本来ブロッキングであるPHPを、ノンブロッキングで動かしてWebSocketサー バーを構築する⼿段は⼤きく2パターンあることがわかる • PHPのストリーム関数やFiber等のコルーチンを使ってI/Oを 多重化する(Ratchet/AMPHP/Workerman) • PHPプログラムを実⾏させる仕組み⾃体を変えてノンブロッ
キングにする(Swoole)
Copyright© M&Aクラウド まとめ 2025年現在でPHPでWebSocketサーバーを構築するなら • コンテナ環境ならSwoole • レンタルサーバーとかならAMPHP がいいんじゃないでしょうか(本番運⽤はしたことないので無責任) 普通にNode.jsやGoでいいと思います
Copyright© M&Aクラウド オンラインコミュニティを運営しています 7/1(⽕) 20:00〜オンラインチャット(oVice)にてわいわいやりますのでぜひご参加ください
Copyright© M&Aクラウド echo “thanks watching”; ?>