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
310
PHPでWebSocketサーバーを実装しよう2025
PHPカンファレンス2025
kubotak
June 28, 2025
Tweet
Share
More Decks by kubotak
See All by kubotak
情報漏洩させないための設計
kubotak
6
2.2k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
140
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
550
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
910
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
11k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.3k
ウォーターフォールに思えたプロジェクトにあったアジャイルの要素
kubotak
2
800
Felteで作る簡単フォームバリデーション
kubotak
1
1.7k
SvelteKitを本番投入してみて
kubotak
2
2.1k
Other Decks in Programming
See All in Programming
AIエージェントはこう育てる - GitHub Copilot Agentとチームの共進化サイクル
koboriakira
0
730
可変変数との向き合い方 $$変数名が踊り出す$$ / php conference Variable variables
gunji
0
150
フロントエンドのパフォーマンスチューニング
koukimiura
5
2k
ペアプロ × 生成AI 現場での実践と課題について / generative-ai-in-pair-programming
codmoninc
2
21k
NEWT Backend Evolution
xpromx
1
130
ご注文の差分はこちらですか? 〜 AWS CDK のいろいろな差分検出と安全なデプロイ
konokenj
3
550
DMMを支える決済基盤の技術的負債にどう立ち向かうか / Addressing Technical Debt in Payment Infrastructure
yoshiyoshifujii
3
220
High-Level Programming Languages in AI Era -Human Thought and Mind-
hayat01sh1da
PRO
0
870
iOS 26にアップデートすると実機でのHot Reloadができない?
umigishiaoi
0
140
効率的な開発手段として VRTを活用する
ishkawa
0
160
おやつのお供はお決まりですか?@WWDC25 Recap -Japan-\(region).swift
shingangan
0
140
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
220
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.5k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
7
750
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
830
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Typedesign – Prime Four
hannesfritz
42
2.7k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
21
1.3k
How to Ace a Technical Interview
jacobian
278
23k
Scaling GitHub
holman
460
140k
Building Flexible Design Systems
yeseniaperezcruz
328
39k
Agile that works and the tools we love
rasmusluckow
329
21k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.4k
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”; ?>