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
410
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
Langfuseと歩む生成AI活用推進
licux
3
250
Terraform やるなら公式スタイルガイドを読もう 〜重要項目 10選〜
hiyanger
13
3.1k
A Gopher's Guide to Vibe Coding
danicat
0
150
ワープロって実は計算機で
pepepper
2
1.3k
レガシープロジェクトで最大限AIの恩恵を受けられるようClaude Codeを利用する
tk1351
2
120
プロダクトという一杯を作る - プロダクトチームが味の責任を持つまでの煮込み奮闘記
hiliteeternal
0
460
ゲームの物理
fadis
5
1.2k
React 使いじゃなくても知っておきたい教養としての React
oukayuka
18
5.7k
대규모 트래픽을 처리하는 프론트 개발자의 전략
maryang
0
120
Infer入門
riru
4
1.5k
CLI ツールを Go ライブラリ として再実装する理由 / Why reimplement a CLI tool as a Go library
ktr_0731
3
1.1k
生成AI、実際どう? - ニーリーの場合
nealle
0
110
Featured
See All Featured
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
183
54k
Typedesign – Prime Four
hannesfritz
42
2.8k
How GitHub (no longer) Works
holman
314
140k
Faster Mobile Websites
deanohume
309
31k
Agile that works and the tools we love
rasmusluckow
329
21k
Mobile First: as difficult as doing things right
swwweet
223
9.9k
RailsConf 2023
tenderlove
30
1.2k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
3.1k
Adopting Sorbet at Scale
ufuk
77
9.5k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
A better future with KSS
kneath
239
17k
Thoughts on Productivity
jonyablonski
69
4.8k
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”; ?>