Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
PHPでWebSocketサーバーを実装しよう2025
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
kubotak
June 28, 2025
Programming
2.6k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
PHPでWebSocketサーバーを実装しよう2025
PHPカンファレンス2025
kubotak
June 28, 2025
More Decks by kubotak
See All by kubotak
僕も、PHPフレームワーク作ってみた
kubotak
0
300
ハーネスエンジニアリング白書
kubotak
0
160
Laravelにはdeleted_atがありますけど?
kubotak
2
120
情報漏洩させないための設計
kubotak
6
3.3k
Svelteコンポーネントの依存関係に秩序を〜
kubotak
0
250
DMARCレポート可視化ツールを SvelteKitで作った話
kubotak
2
730
Superforms本番投入で分かった良さとハマりどころ
kubotak
0
1.1k
Storybookを書くだけでリグレッションテストが 実行される世界へようこそ
kubotak
31
12k
(うまくいった||いかなかった) 技術選定は何を考えていたか
kubotak
1
1.6k
Other Decks in Programming
See All in Programming
C#の現在地 進化の歴史と、AI時代の.NET Everywhere
neuecc
5
5.1k
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
150
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
120
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.6k
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
140
Androidだけじゃない、DroidKaigiで広がった私の技術スタック
akkeylab
0
130
APNsからLive Activityを開始する話
yumnumm
0
170
作れる、でも消せるか?──安全に「枯らして消す」機能削除術 / Drain, Then Delete
chobishiba
2
250
Are APIs Still Relevant in the AI Era?
soyuka
0
460
contenteditable と日本語入力に向き合う
colorful12
0
190
SREの越境 / SRE Collaboration
y0hgi
2
310
Featured
See All Featured
How to train your dragon (web standard)
notwaldorf
96
6.9k
What does AI have to do with Human Rights?
axbom
PRO
1
2.4k
Facilitating Awesome Meetings
lara
57
7.2k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Music & Morning Musume
bryan
48
7.4k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Docker and Python
trallard
47
4.2k
The Curse of the Amulet
leimatthew05
3
15k
BBQ
matthewcrist
90
10k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
300
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Taking LLMs out of the black box: A practical guide to human-in-the-loop distillation
inesmontani
PRO
3
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”; ?>