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
590
PHPでWebSocketサーバーを実装しよう2025
PHPカンファレンス2025
kubotak
June 28, 2025
Tweet
Share
More Decks by kubotak
See All by kubotak
情報漏洩させないための設計
kubotak
6
2.3k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
160
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
570
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
960
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
11k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.3k
ウォーターフォールに思えたプロジェクトにあったアジャイルの要素
kubotak
2
840
Felteで作る簡単フォームバリデーション
kubotak
1
1.7k
SvelteKitを本番投入してみて
kubotak
2
2.1k
Other Decks in Programming
See All in Programming
SpecKitでどこまでできる? コストはどれくらい?
leveragestech
0
360
半自動E2Eで手っ取り早くリグレッションテストを効率化しよう
beryu
6
2.3k
ててべんす独演会〜Flowの全てを語ります〜
tbsten
1
220
CSC305 Lecture 03
javiergs
PRO
0
220
スマホで海難事故は防げるか?年間2000件以上の小型船舶の事故に挑むアプリ開発
atsuki_seo
0
120
CSC509 Lecture 01
javiergs
PRO
1
430
そのpreloadは必要?見過ごされたpreloadが技術的負債として爆発した日
mugitti9
2
2.5k
高度なUI/UXこそHotwireで作ろう Kaigi on Rails 2025
naofumi
4
2.3k
メモリ不足との戦い〜大量データを扱うアプリでの実践例〜
kwzr
1
640
ABEMAモバイルアプリが Kotlin Multiplatformと歩んだ5年 ─ 導入と運用、成功と課題 / iOSDC 2025
akkyie
0
300
10年もののAPIサーバーにおけるCI/CDの改善の奮闘
mbook
0
610
非同期jobをtransaction内で 呼ぶなよ!絶対に呼ぶなよ!
alstrocrack
0
290
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Building a Modern Day E-commerce SEO Strategy
aleyda
43
7.7k
Automating Front-end Workflow
addyosmani
1371
200k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
The Cost Of JavaScript in 2023
addyosmani
53
9k
Code Reviewing Like a Champion
maltzj
525
40k
Faster Mobile Websites
deanohume
310
31k
A Tale of Four Properties
chriscoyier
160
23k
Statistics for Hackers
jakevdp
799
220k
Rails Girls Zürich Keynote
gr2m
95
14k
How STYLIGHT went responsive
nonsquared
100
5.8k
A Modern Web Designer's Workflow
chriscoyier
697
190k
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”; ?>