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で書いて覚える非同期処理 / php-async-programming
Search
Ryo Tomidokoro
October 03, 2021
Technology
6
6.4k
PHPで書いて覚える非同期処理 / php-async-programming
これを読んでも、非同期処理はわかりませんが、暗いトンネルの先に光が見えます。
Ryo Tomidokoro
October 03, 2021
Tweet
Share
More Decks by Ryo Tomidokoro
See All by Ryo Tomidokoro
100分で本番デプロイ!Laravelで作るWebアプリケーション作成/100min_web_app_cicd
hanhan1978
1
51
PHPerのための計算量入門/Complexity101 for PHPer
hanhan1978
6
1.8k
集中して作業する技術/how_to_work_deeply
hanhan1978
62
46k
PHPでデータベースを作ってみた/create-data-with-php
hanhan1978
11
9.7k
ADRを一年運用してみた/adr_after_a_year
hanhan1978
8
3.8k
B+木入門:PHPで理解する データベースインデックスの仕組み/b-plus-tree-101
hanhan1978
5
4.9k
ADRを一年運用してみた/our_story_about_adr
hanhan1978
5
2.1k
PHPで学ぶ Session の基本と応用 / web-app-session-101-2024
hanhan1978
12
5.7k
レガシー回避のPHP開発術/avoid_php_legacy
hanhan1978
16
13k
Other Decks in Technology
See All in Technology
7日間でハッキングをはじめる本をはじめてみませんか?_ITエンジニア本大賞2025
nomizone
2
1.9k
【Developers Summit 2025】プロダクトエンジニアから学ぶ、 ユーザーにより高い価値を届ける技術
niwatakeru
2
1.4k
運用しているアプリケーションのDBのリプレイスをやってみた
miura55
1
740
PHPで印刷所に入稿できる名札データを作る / Generating Print-Ready Name Tag Data with PHP
tomzoh
0
110
Classmethod AI Talks(CATs) #17 司会進行スライド(2025.02.19) / classmethod-ai-talks-aka-cats_moderator-slides_vol17_2025-02-19
shinyaa31
0
120
あれは良かった、あれは苦労したB2B2C型SaaSの新規開発におけるCloud Spanner
hirohito1108
2
620
インフラをつくるとはどういうことなのか、 あるいはPlatform Engineeringについて
nwiizo
5
2.6k
Building Products in the LLM Era
ymatsuwitter
10
5.5k
偶然 × 行動で人生の可能性を広げよう / Serendipity × Action: Discover Your Possibilities
ar_tama
1
1.1k
Tech Blogを書きやすい環境づくり
lycorptech_jp
PRO
1
240
レビューを増やしつつ 高評価維持するテクニック
tsuzuki817
1
730
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
410
Featured
See All Featured
The Cult of Friendly URLs
andyhume
78
6.2k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Fireside Chat
paigeccino
34
3.2k
Practical Orchestrator
shlominoach
186
10k
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
4
410
Writing Fast Ruby
sferik
628
61k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Build your cross-platform service in a week with App Engine
jlugia
229
18k
Raft: Consensus for Rubyists
vanstee
137
6.8k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
114
50k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
Transcript
@hanhan1978 PHPで 書いて覚える非同期処理 PHPカンファレンス 2021
@hanhan1978 • 富所 亮 • 所属 ◦ 株式会社カオナビ • 職業
◦ Webアプリケーションエンジニア • ブログ ◦ https://blog.hanhans.net • Yokohama North AM ◦ https://anchor.fm/yokohama-north-am 2
はじめに 3
4 PHPアプリケーションは 同期的なBlocking IOが基本
5 私達が書いたプログラムは書いた順番に 処理されて動作する 人間の脳にとてもやさしい
6 非同期は、分かりにくい 界隈では、関連情報が増加してきているのは感じる Swoole, React, AmPHP…. Generator, Fiber
7 書いたプログラムは書いた順番に動くとは 限らない 人間の脳にとても厳しい
8 今回のテーマ
9 「非同期が分からない!」 を分解
10 今日のテーマ
11 裏テーマ
12 システムコールとか、Socket通信とかを PHPで書こうと思う人を増やす
13 Webサーバーが作れるようになるぞ! https://speakerdeck.com/hanhan1978/phpdewebsabazuo-rou
PHPでPHPを動かす時代が来る! 14 多分
小ネタ 平行じゃない => 並行 平行 : parallel 並行 : concurrent,
(parallel) 並列 : parallel 15
1. 用語の定義 2. なぜ必要なのか? 3. 非同期関連の実装 4. PHPで使える解決策 目次 16
同期的なプログラミング 記述したとおりの順番で動作するようなプログラミングモデル 非同期プログラミング 独立して発生するイベントに対する処理を記述するための並行プログラミン グ手法の総称 17 高野祐輝. (2021). 並行プログラミング入門 5章
(初版.). オライリー・ジャパン.
同期的なプログラミング 記述したとおりの順番で動作するようなプログラミングモデル 非同期プログラミング 独立して発生するイベントに対する処理を記述するための並行プログラミン グ手法の総称 18 高野祐輝. (2021). 並行プログラミング入門 5章
(初版.). オライリー・ジャパン. 処理の順番はイベントの発 生順に依存する
19 Async Programming - ColdBox HMVC Documentation https://coldbox.ortusbooks.com/digging-deeper/promises-async-programming
20 Async Programming - ColdBox HMVC Documentation https://coldbox.ortusbooks.com/digging-deeper/promises-async-programming タスクは直列に実行され るため、全ての処理を足
し合わせた実行時間にな る
21 Async Programming - ColdBox HMVC Documentation https://coldbox.ortusbooks.com/digging-deeper/promises-async-programming タスクは並列に実行され るため、全体の処理時間
≒ 最も長いタスクの時間
22 例えばPHP
23 ToDoリストを検索するバックエンドの処理(例)
24 ToDoリストを検索するバックエンドの処理(例) 直列に処理しなければ、整合 性が取れない。 同期的処理に意味がある
25 例えばJavaScript
26 buttonクリックで発生するイベント
27 buttonクリックで発生するイベント ボタンがいつ押されるかは分 からない。 非同期的処理に意味がある
28 例えばJavaScript - part2
29 ページ読込み後にAjaxでAPIをコールする例
30 buttonクリックで発生するイベント 付帯情報は、あとでページに表示 されれば問題ない 非同期的処理に意味がある
改めて比べてみると 向き・不向きに合わせてプログラミングモ デルが選択されているだけ 31 特にJavaScriptは、処理をブロックしないことに心血を注いでいる
32 小ネタ2 JSの人たち 「たまには同期してほしい」 PHPの人たち 「たまには非同期してほしい」
1. 用語の定義 2. なぜ必要なのか? 3. 非同期関連の実装 4. PHPで使える解決策 目次 33
34 JavaScriptで考えてみる
35 Amazon トップページ
36 Amazon トップページ 各要素は、スクロールに合わ せて読み込まれる 非同期であることがUX向上に ダイレクトにつながる
JSの非同期処理の実行モデル 37 https://zenn.dev/qnighy/articles/345aa9cae02d9d
38 PHP(バックエンド)で考えてみる
39 いわゆるMVCフレームワーク
40 いわゆるMVCフレームワーク 1. 認証して
41 いわゆるMVCフレームワーク 2. 過去の参加イベントを 取る
42 いわゆるMVCフレームワーク 3. メインに表示する情報 を取得
43 非同期にしてしまうと、事前に必要なデー タが取れていない。 同期的であることに意味があるパターン が多い。
44 バックエンドのひとつのエンドポイントから 考えると、非同期処理の必要性が分から なくなる
45 うまく適用できた例
46 https://speakerdeck.com/suzuki/guzzle-promisewoshi-tuta-fei-tong-qi-chu-li-niy oruapikorufalsegao-su-hua
47 https://www.slideshare.net/techblogyahoo/phpioyield-phpcon2014
48 同時に実行しても問題ないIO処理を束ね る
49 その他の適用例
50 Queue
51 Laravel Queues [ Pocket Guide ] - DEV Community
https://dev.to/mvpopuk/laravel-queues-pocket-guide-c6a
52 イベント監視が別プロセスだけど... メール送信、退会バッチ処理等、適用範囲も広 い。長いIOを他のプロセスにまかせてしまい結 果をすばやく戻す
53 PHP単体だと、非同期処理は適用範囲が 狭い
54 なぜ非同期フレームワークは生まれ なぜFiberは実装されるのか
55 視野を広げてみる必要がある
56 いわゆる PHP のWebアプリ
57 Nginx + PHP-FPM PHP処理系の気の効いた図
1リクエストに対して 1つのPHP実行プロセス 58
1リクエストに対して 1つのPHP実行プロセス 59 各リクエストは、隔離されたプロセ スで実行され、互いに影響しない
60 既存のPHPの処理モデルは 同期的、ステートレス
61 例えば、Swoole PHP
Swooleサーバーの概要図 62
Swooleプロセス自体が1つのPHPプロセス 63
Swooleプロセス自体が1つのPHPプロセス 64 各リクエストは、同じプロセス内で 実行される。 コルーチンで分離されている
65 Swoole が非同期で目指すこと 1つのコルーチンがIO処理待ちになったら、次のコ ルーチンに処理を移す CPUの利用効率をあげる。
66 Swoole が目指すのは 非同期的でステートフルな処理モデル
67 しかし、エンドポイント単位の視点に立つ と -> リクエストは同期的に処理されているよ うにみえる
68 だから、PHPerには非同期処理がわかり ずらい。
1. 用語の定義 2. なぜ必要なのか? 3. 非同期関連の実装 4. PHPで使える解決策 目次 69
この章はPHPで非同期実装の感覚を養う話 70
71 PHP単体での非同期処理の仕組みはな い(多分) システムコールと組み合わせて、非同期 に処理を行う実装を行う
72 ここで、ちょっとだけ事前説明
73 システムコール オペレーティングシステム (OS)(より明確に言えばOS のカーネル)の機能を呼び出すために使用される機構 のこと。
74 Socket Functions https://www.php.net/manual/en/ref.sockets.php
75 Socket通信
76 https://world4java.wordpress.com/2014/02/28/socket-programming/ Socket Programming
77 IOモデル
78 • ブロッキング IO • ノンブロッキング IO • IO 多重化
• シグナル IO • 非同期 IO
79 • ブロッキング IO • ノンブロッキング IO • IO 多重化
• シグナル IO • 非同期 IO ← この2つは今日は扱いません
80 IOモデルを文章だけで 理解するのは難しいので...
81 Echoサーバー
82 文字列を受け取って、文字列を返すだけのサーバー
83 文字列を受け取って、文字列を返すだけのサーバー echoサーバーに接続
84 文字列を受け取って、文字列を返すだけのサーバー 入力した文字列がそのま ま戻ってくる
85 Echoサーバー実装は、非同期処理関連の実 装技術を知るための、極めて効果的でコスパ が高い方法 写経をオススメします!!
86 https://speakerdeck.com/bati11/otozhong-liang-kunaruhua C言語の実装例 本当はコレを写経するのが良い が...
PHPでの実装例 87 https://github.com/hanhan1978/shadow-php/tree/master/echo-server
88 Blocking IO
89
90 ブロッキングIO
91 ブロッキングIO SocketでListen
92 ブロッキングIO ここでBlock
93 ブロッキングIO このサーバーは、通信をBlockするの で、一度に1クライアントしか扱えない
94 NonBlocking IO
95
96 ノンブロッキングIO SocketをNonBlockに設定
ノンブロッキングIO 97
ノンブロッキングIO 98 このサーバーは、無限Loopしなが ら、接続したクライアントを自分で管 理して、通信できる。
99 IO多重化
100
101 IO多重化
102 IO多重化 ここでBlock
103 IO多重化 Select は状態が変化したSocket全 てを検知できるので、Blockはしてい るが、複数のクライアントを処理でき る
104 例えば... Guzzleのasyncリクエスト
105 Guzzleのpromise
106 Guzzleのpromise 内部では curlmulti が使われて いて、poll でIO多重化されてる
107 非同期処理では、システムコールやIOモ デルの理解が重要になる
108 小ネタ3 雑に strace を使うと、裏側で使っている システムコールが簡単に見れる
1. 用語の定義 2. なぜ必要なのか? 3. 非同期関連の実装 4. PHPで使える解決策 目次 109
110 非同期フレームワーク
111 Swoole, React, AmPHP
112 3者ともに、ノンブロッキングのイベント駆 動を指向 -> 解決しようとする課題は同じ Amp は V3 で Fiber
に対応している
113 Generator
114 Generator (非対称コルーチンの非同期処理実装例 ) Ngyuki chatの例 https://qiita.com/ngyuki/items/1f0ec69db9d78ba50ebb
115 Fiber
116 https://wiki.php.net/rfc/fibers RFC
117 https://qiita.com/rana_kualu/items/6247441f6fdd63c10a06 【PHP8.1】PHPで簡単に非同期処理を書けるようになる
118 とまあ建前は置いておいて
119 • 一般開発者が使う機能ではない • コアに入ったのでXdebugが動く • Schedulerとかはまだ • Async/Await とかもまだ
120 Generatorと何が違う?
121 • スタックのどこからでも停止・再開 • FiberError, FiberExit
122 じゃあ、今の状態で何ができる?
123 Generator同様に、メソッドの実行停止・再開ができる
124 Generator同様に、メソッドの実行停止・再開ができる Fiberインスタンス生成
125 Generator同様に、メソッドの実行停止・再開ができる Fiber実行開始
126 Generator同様に、メソッドの実行停止・再開ができる ここで止まる
127 Generator同様に、メソッドの実行停止・再開ができる ここで再開
Main と Fiber を行ったりきたり 128
Main と Fiber を行ったりきたり 129 これは非同期じゃない。シングル スレッドで同期的に動いている
非同期IOと組み合わせると... 130
非同期IOと組み合わせると... 131 ノンブロッキングやIO多重化を組 み合わせることで suspend に意 味がでる
Generatorを使った実装のサンプルはま だまだ少ない 私と一緒に是非 shadow-php へ... 132
133 参考資料
134 Mastering Swoole PHP - Bruce Dou Swoole 作者による解説著作 全体の2/3がPHPの処理モデル
やIOモデルの説明となっていて、 非同期を取り巻く状況を雑観でき る。
135 並行プログラミング入門 - 高野 祐輝 並行処理について、裏側の仕組 みから解説してくれる本 包括的に書かれていて、とりあえ ずコレ一冊やるとだいぶ霧が晴れ る感じがあります。
136 n月刊ラムダノート Vol.1 コルーチンについて、歴史から詳 しく載っています。 これを読んだおかげで、 Async/Await や Promiseについ ても理解が深まりました。
137 計算機プログラムの構造と解釈 第2版 第五章 Stream 直接非同期には関係ないのだけ れど、関数に状態を閉じ込めると いう考え方が、非対称コルーチン に通じるところがあり、面白いで す。
@hanhan1978 相談・指摘・その他 下記のTwitterアカウントにどうぞ 138